I. Rise of Shadows
题意
有一个时钟,时针走一圈就是一天,现在给定时针走一圈要 H H H 小时,分针走一圈要 M M M 分钟,设 α = 2 π A M H \alpha =\frac{2\pi A}{MH} α=MH2πA ,求一天中时针和分针夹角小于等于 α \alpha α 的整数时刻(这一天从 0 0 0 开始的整数分钟)有几次。
题解
分针的角速度 ω 1 = 2 π M \omega _1 = \frac{2 \pi}{ M} ω1=M2π ,时针的角速度 ω 2 = 2 π M H \omega _ 2 = \frac{2\pi}{MH} ω2=MH2π ,固定时针,即求满足不等式 t ⋅ ( ω 1 − ω 2 ) % M H ⩽ α t \cdot( \omega _ 1 - \omega _ 2) \% MH \leqslant \alpha t⋅(ω1−ω2)%MH⩽α 的 t t t 的所有整数解。对上式整理有 t ⋅ ( H − 1 ) % M H ⩽ A t \cdot (H - 1) \% MH\leqslant A t⋅(H−1)%MH⩽A .由于分针相对于时针的位置有两种,我们仅考虑右侧,另一侧对称可得。
令 g = gcd ( H − 1 , M H ) g = \gcd(H - 1, MH) g=gcd(H−1,MH) ,不等式 两侧同除 g g g 得 t ⋅ H − 1 g % M H g ⩽ A g t \cdot \frac{H - 1}{g} \% \frac{MH}{g}\leqslant \frac{A}{g} t⋅gH−1%gMH⩽gA ,此时 t ∈ [ 0 , M H g ) t \in [0,\frac{MH}{g}) t∈[0,gMH)
由于 ( H − 1 g , M H g ) = 1 (\frac{H - 1}{g} , \frac{MH}{g}) = 1 (gH−1,gMH)=1 ,那么原不等式等价于 t % M H g ⩽ A g t \% \frac{MH}{g}\leqslant \frac{A}{g} t%gMH⩽gA
t 可以取 0,1,2 ⋯ A g \cdots \frac A g ⋯gA 共 A g + 1 \frac{A}{g} + 1 gA+1 个
所以左右两侧共 2 ⋅ ( A g + 1 ) − 1 = 2 ⋅ A g + 1 2 \cdot (\frac A g + 1) - 1=2\cdot\frac A g +1 2⋅(gA+1)−1=2⋅gA+1 个
在上面除 g g g 的时候我们把 t t t 的取值范围从 [ 0 , M N ) [0,MN) [0,MN) 缩小到 [ 0 , M H g ) [0,\frac{MH}{g}) [0,gMH),故最后的答案为 g ⋅ ( 2 ⋅ A g + 1 g \cdot(2\cdot\frac A g + 1 g⋅(2⋅gA+1 )
当 A = M H 2 A = \frac{MH}{2} A=2MH 时,此时 α = π \alpha =\pi α=π,故所有的 t t t 都符合题意,此时答案 为 M H MH MH ,上面算出的答案为 M H + g > M H MH + g > MH MH+g>MH ,取 min \min min 即可
证明:当 a % b = c a \% b = c a%b=c 时, a k % b k = c k \frac a k \% \frac b k = \frac c k ka%kb=kc 成立 ( a < k , b < k , c < k ) (a < k, b < k, c < k) (a<k,b<k,c<k)
显然有 a = b q + c a = b q + c a=bq+c ,等式两侧同除 k k k 得 a k = b k q + c k \frac a k = \frac b k q + \frac c k ka=kbq+kc ,即 a k % b k = c k \frac a k \% \frac b k = \frac c k ka%kb=kc ,证毕.
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
int main(){
ll h, m, a;
cin >> h >> m >> a;
ll g = __gcd(h - 1, h * m);
cout << min(m * h, g * (2 * (a / g) + 1)) << endl;
return 0;
}