A Again Twenty Five!
題 意 : 求 5 n 的 最 後 2 位 , 2 ≤ n ≤ 10 18
分 析 : 直 接 puts("25");
B Moore’s Law
題 意 : 求 n ⋅ 1.000000011 t
分 析 : a n s = n ∗ p o w ( 1.000000011 , t )
C Lucky Numbers
題 意 : 求 最 大 位 數 是 n 的 , 只 含 7 活 8 的 數 字 個 數
分 析 : a n s = 2 1 + 2 2 + ⋯ + 2 n = 2 n + 1 − 2
D Hexagons!
題 意 : 求 構 成 n 層 大 正 六 邊 形 的 小 正 六 邊 形 個 數
分 析 : 看 每 個 邊 發 現 每 層 多 6 個 , 然 後 就 是 等 差 數 列
a n s = 1 + 6 ∗ n + n ∗ ( n − 1 ) / 2 ∗ 6
E A rectangle
題 意 : 給 定 奇 怪 的 坐 標 系 , 求 矩 形 ( x 1 ≤ x 2 , y 1 ≤ y 2 ) 內 六 邊 形 的 中 心 個 數 , 保 證 ( x 1 , y 1 ) 是 六 邊 形 中 心 , 且 ( x 2 − x 1 ) % 2 == 0
分 析 : 限 定 條 件 後 , 發 現 縱 軸 六 邊 形 個 數 是 n , n − 1 交 替
直 接 當 n 算 , 減 去 多 的 一 半 個 數
a n s = ( ( y 2 − y 1 ) / 2 + 1 ) ∗ ( x 2 − x 1 + 1 ) − ( x 2 − x 1 ) / 2 ;
F Selection of Personnel
題 意 : 從 n 個 人 選 一 組 5 、 6 或 7 個 人 的 方 法 數
分 析 : a n s = C 5 n + C 6 n + C 7 n
G Challenge Pennants
題 意 : n 個 不 同 的 桌 子 , A 物 品 5 個 , B 物 品 3 個 , A , B 物 品 必 須 都 放 置 , 求 方 法 數
分 析 : 就 是 允 許 有 空 的 嘛 , 各 加 上 n 個 物 品 轉 化 成 隔 板 法 , 然 後 乘 法 原 理 乘 起 來
a n s = C n − 1 5 + n − 1 ∗ C n − 1 3 + n − 1
H Benches
題 意 : 5 個 不 同 的 棋 子 放 在 n × n 的 網 格 交 點 上 , 求 方 法 數
分 析 : x 與 y 坐 標 選 取 獨 立 , 各 自 方 法 數 是 C 5 n , 選 好 以 後 由 於 不 同 再 全 排 列
a n s = ( C 5 n ) 2 ∗ P 5 5
I Parking Lot
題 意 : 2 ∗ n − 2 個 停 車 位 , 4 種 類 型 的 車 , 要 求 必 須 有 一 種 車 連 續 n 個 , 求 方 法 數
分 析 : 我 不 會 組 合 數 學 解 法 , 考 慮 d p , f [ i ] [ 0 / 1 ] := 前 i 個 車 , 是 否 有 連 續 n 個 同 類 型 車 , 的 方 法 數
f [ i ] [ 0 ] = 1 , f [ i ] [ 0 ] = 0 , 暴 力 轉 移 , 特 判 開 頭 的 車 4 種 方 法 數 , 之 後 的 3 種
f[0 ][0 ] = 1 ;
for (int i = 1 ; i <= 2 * n - 2 ; ++i) {
if (i >= n) f[i][1 ] += (i == n ? 4 : 3 ) * f[i - n][0 ];
for (int j = 1 ; j <= i && j <= n; ++j) {
f[i][0 ] += (i == j ? 4 : 3 ) * f[i - j][0 ];
f[i][1 ] += (i == j ? 4 : 3 ) * f[i - j][1 ];
}
}
a n s = f [ 2 ∗ n − 2 ] [ 1 ]
J Divisibility
題 意 : 求 [ 1 , n ] 同 時 被 n u m b e r s ∈ [ 2 , 10 ] 整 除 的 數 的 個 數
分 析 : a n s = n / l c m 10 i = 2 i = n / 2520
K Indivisibility
題 意 : 求 [ 1 , n ] 不 被 n u m b e r s ∈ [ 2 , 10 ] 整 除 的 數 的 個 數
分 析 : a n s = n − E [ 1 , n ] 被 n u m b e r s ∈ [ 2 , 10 ] 整 除 的 數
後 面 這 個 容 斥 原 理 就 好 了 , 容 斥 一 下 l c m
vector <int > v;
for (int i = 2 ; i <= 10 ; ++i) v.push_back(i);
long long ans = n;
for (int i = 1 ; i < 1 << 9 ; ++i) {
int cnt = 0 , lcm = 1 ;
for (int j = 0 ; j < 9 ; ++j)
if (i >> j & 1 ) lcm = lcm / __gcd(lcm, v[j]) * v[j], ++cnt;
if (cnt & 1 ) ans -= n / lcm;
else ans += n / lcm;
}
printf ("%I64d\n" , ans);
L Cracking the Code
題 意 : 給 定 一 個 重 排 數 字 方 式 , N → N c , 求 N 5 c 的 後 5 位 數
分 析 : 直 接 模 擬
char s[10 ], t[10 ];
int d[] = {0 , 1 , 3 , 5 , 4 , 2 };
for (int i = 1 ; i <= 5 ; ++i) t[i] = s[d[i]];
long long x = atoi(t + 1 ), ans = 1 ;
for (int i = 1 ; i <= 5 ; ++i)
ans = ans * x % 100000 ;
printf ("%05I64d\n" , ans);
M Turn
題 意 : 照 圖 的 意 思 ( 藍 兒 題 裏 相 反 ) 就 是 , + 度 數 代 表 逆 時 針 轉 的 , − 度 數 代 表 順 時 針 轉 的 , 問 需 要 順 時 針 轉 幾 下 才 能 和 0 ∘ 差 距 最 小
分 析 : 暴 力 枚 舉 0 ∼ 3 次 旋 轉 , 取 最 小 那 個
int dif = INF, ans = -1 ;
for (int i = 0 ; i < 4 ; ++i) {
int y = ((x - 90 * i) % 360 + 360 ) % 360 ;
y = min(y, 360 - y);
if (y < dif) ans = i, dif = y;
}
printf ("%d\n" , ans);
N Forecast
題 意 : 給 定 必 有 2 個 實 根 的 二 元 一 次 方 程 , 輸 出 兩 個 根
分 析 : 求 根 公 式
double delta = sqrt (b * b - 4 * a * c);
double r1 = (-b - delta) / 2 / a, r2 = (-b + delta) / 2 / a;
if (r1 < r2) swap(r1, r2);
printf ("%.12f\n%.12f\n" , r1, r2);
O Arrow
題 意 : 給 定 圖 上 的 那 些 東 西 , 然 後 求 向 量 指 向 的 端 點 , 逆 時 針 輸 出
分 析 : 計 算 幾 何 模 版 直 接 搞
double px, py, vx, vy, a, b, c, d;
struct Point {
double x, y;
void read() {scanf ("%lf%lf" , &x, &y);}
void print() {printf ("%.12f %.12f\n" , x, y);}
Point operator +(const Point& p) {
return {x + p.x, y + p.y};
}
Point operator -(const Point& p) {
return {x - p.x, y - p.y};
}
Point operator *(const double & c) {
return {c * x, c * y};
}
double length() {return hypot(x, y);}
void normalize() {
double len = length();
x /= len;
y /= len;
}
Point rotate() {
return {y, -x};
}
};
using Vector = Point;
cin >> px >> py >> vx >> vy >> a >> b >> c >> d;
Point p = {px, py};
Vector v = {vx, vy};
v.normalize();
Vector w = v.rotate();
(p + v * b).print();
(p - w * (a / 2. )).print();
(p - w * (c / 2. )).print();
(p - w * (c / 2. ) - v * d).print();
(p + w * (c / 2. ) - v * d).print();
(p + w * (c / 2. )).print();
(p + w * (a / 2. )).print();
P Area of a Star
題 意 : 給 定 n , r , 求 圓 內 接 正 n 角 星 的 面 積
分 析 : 就 是 求 圖 中 的 這 個 三 角 形 面 積 , 作 O C 垂 直 於 A B 交 於 C , 三 角 函 數 搞 一 搞
S = 2 n ∗ S △ O A B
double alpha = PI / n / 2 , beta = PI / n;
double theta = alpha + beta;
double OC = r * sin (alpha), OB = OC / sin (theta);
double ans = n * OB * r * sin (beta);
printf ("%.12f\n" , ans);
Q Pyramids
題 意 : 求 所 有 邊 長 相 等 的 正 n 棱 錐 的 體 積
分 析 : 以 這 樣 的 正 三 棱 錐 舉 例 :
首 先 θ = 2 π / n
作 O E 垂 直 於 C D 於 E , 在 S △ O C E 中 , O C = 1 2 l s i n ( 1 2 θ )
作 A O 垂 直 於 S △ B C D 於 O , 在 S △ A O C 中 , A O = l 2 − | O C | 2 − − − − − − − − − √
S △ B C D = n ⋅ S △ O C D = n ⋅ 1 2 | O C | 2 ⋅ s i n ( θ )
S = 1 3 ⋅ | A O | ⋅ S △ B C D
問 題 解 決
int l[10 ];
double base, height;
void get(int n) {
double theta = 2 * acos (-1 ) / n;
double OC = 0.5 * l[n] / sin (theta / 2 );
base = n * (0.5 * OC * OC * sin (theta));
height = sqrt (l[n] * l[n] - OC * OC);
}
for (int i = 3 ; i <= 5 ; ++i) scanf ("%d" , l + i);
double ans = 0 ;
for (int i = 3 ; i <= 5 ; ++i) {
get(i);
ans += base * height / 3 ;
}
printf ("%.12f\n" , ans);
R Game
題 意 : 給 定 n × n 的 網 格 , 遊 戲 規 則 如 下 : 兩 個 輪 流 選 格 子 , 但 是 選 取 的 格 子 不 能 與 任 意 一 個 格 子 共 邊 , 不 能 選 取 者 輸
假 設 兩 人 均 採 取 最 優 策 略 , 先 手 贏 輸 出 1 , 後 手 輸 出 2
分 析 : 畫 1 × 1 , 2 × 2 , 3 × 3 , 4 × 4 , 5 × 5 的 發 現 , n 爲 奇 數 時 多 種 方 法 選 取 中 能 選 取 的 格 子 總 是 奇 數 個 , n 爲 偶 數 有 偶 數 個
故 n 爲 奇 數 先 手 贏 , 偶 數 後 手 贏
直 接 puts(n & 1 ? "1" : "2");