Long Luo's Life Notes

每一天都是奇迹

By Long Luo

阿里巴巴达摩院 从 2018 年开始每年都会举办一届全球数学竞赛,之前一方面自己数学水平比较弱,另外一方面也没有报名,但一直很仰慕那些数学大神的风采。今年是第一次报名参加 2024阿里巴巴全球数学竞赛 ,上周末参加了预选赛,但遗憾的是,全部 \(7\) 道题中只有第 \(1, 2, 6\) 题会做,这里分享下我的解答:

Problem 1

几位同学假期组成一个小组去某市旅游. 该市有 \(6\) 座塔,它们的位置分别为 \(A, B, C, D, E, F\) 。同学们自由行动一段时间后,每位同学都发现,自己在所在的位置只能看到位于 \(A, B, C, D\) 处的四座塔,而看不到位于 \(E\)\(F\) 的塔。已知:

  1. 同学们的位置和塔的位置均视为同一平面上的点,且这些点彼此不重合;
  2. 塔中任意 \(3\) 点不共线;
  3. 看不到塔的唯一可能就是视线被其它的塔所阻挡,例如,如果某位同学所在的位置 \(P\)\(A , B\) 共线,且 \(A\) 在线段 \(PB\) 上,那么该同学就看不到位于 \(B\) 处的塔。

(5 分) 请问 这个旅游小组最多可能有多少名同学?

\(A. 3\)
\(B. 4\) \(C. 6\) \(D. 12\)

Solution

这道题选 \(C\) ,最多只能有 \(6\) 名同学。

这道题的解题思路是从假设只有 \(1\) 座塔开始,一直到 \(6\) 座塔,找到思路。

  1. 假设有 \(1\) 座塔 \(A\) ,那么很显然有无数多同学可以看到塔 \(A\) ,也可以有无数多同学看不到塔 \(A\)​ ;

  2. 假设有 \(2\) 座塔 \(A, B\) ,那么只有以 \(A\) 为起点的射线 \(AB\) 且位于 \(B\) 之后的同学无法看到塔 \(A\)

  3. 假设有 \(3\) 座塔 \(A, B, C\) ,同理可知存在无数位同学至少可以看见 \(2\) 座塔;

  4. 假设有 \(4\) 座塔 \(A, B, C, D\) ,同理可知存在无数位同学至少可以看见 \(2\) 座塔;

  5. 假设有 \(6\) 座塔 \(A, B, C, D, E, F\) ,如果每位同学都无法看见 \(E, F\) 塔,如下图1 所示:

图1. Solution of Problem 1

所以至多有 \(6\) 位同学位于 \(M, N, O, P, R, Q\) 处,无法看到塔 \(E, F\)

阅读全文 »

By Long Luo

挖坑!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* Returns the trigonometric sine of an angle. Special cases:
* <ul><li>If the argument is NaN or an infinity, then the
* result is NaN.
* <li>If the argument is zero, then the result is a zero with the
* same sign as the argument.</ul>
*
* <p>The computed result must be within 1 ulp of the exact result.
* Results must be semi-monotonic.
*
* @param a an angle, in radians.
* @return the sine of the argument.
*/
@HotSpotIntrinsicCandidate
public static double sin(double a) {
return StrictMath.sin(a); // default impl. delegates to StrictMath
}
1
2
3
4
5
6
7
8
9
10
11
/**
* Returns the trigonometric sine of an angle. Special cases:
* <ul><li>If the argument is NaN or an infinity, then the
* result is NaN.
* <li>If the argument is zero, then the result is a zero with the
* same sign as the argument.</ul>
*
* @param a an angle, in radians.
* @return the sine of the argument.
*/
public static native double sin(double a);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* @(#)k_sin.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/

/* __kernel_sin( x, y, iy)
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13
* sin(x) ~ x + S1*x + ... + S6*x
* where
*
* |sin(x) 2 4 6 8 10 12 | -58
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
* | x |
*
* 4. sin(x+y) = sin(x) + sin'(x')*y
* ~ sin(x) + (1-x*x/2)*y
* For better accuracy, let
* 3 2 2 2 2
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
* then 3 2
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
*/

#ifndef __FDLIBM_H__
#include "fdlibm.h"
#endif

double __kernel_sin(double x, double y, int iy)
{
double z, r, v;
int32_t ix;

static const double half = 5.00000000000000000000e-01; /* 0x3FE00000, 0x00000000 */
static const double S1 = -1.66666666666666324348e-01; /* 0xBFC55555, 0x55555549 */
static const double S2 = 8.33333333332248946124e-03; /* 0x3F811111, 0x1110F8A6 */
static const double S3 = -1.98412698298579493134e-04; /* 0xBF2A01A0, 0x19C161D5 */
static const double S4 = 2.75573137070700676789e-06; /* 0x3EC71DE3, 0x57B1FE7D */
static const double S5 = -2.50507602534068634195e-08; /* 0xBE5AE5E6, 0x8A2B9CEB */
static const double S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */

GET_HIGH_WORD(ix, x);
ix &= IC(0x7fffffff); /* high word of x */
if (ix < IC(0x3e400000)) /* |x| < 2**-27 */
{
if ((int32_t) x == 0)
return x; /* generate inexact */
}
z = x * x;
v = z * x;
r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
if (iy == 0)
return x + v * (S1 + z * r);
else
return x - ((z * (half * y - v * r) - y) - v * S1);
}

\[ \sin (x_0 + \Delta x) \approx \sin (x_0) + \sin'(x_0) \frac {\Delta x}{1!} + \sin''(x_0) \frac { \Delta x^2}{2!} + \sin'''(x_0) \frac {\Delta x^3}{3!} + \cdots \]

参考文献

  1. C mathematical functions
  2. Sine and cosine
0%