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");