2020ICPC沈阳I. Rise of Shadows

博客探讨了一个关于时钟时针和分针夹角的数学问题,通过分析时针和分针的角速度,建立了不等式模型。利用最大公约数简化问题,并给出了解题步骤和代码实现。该问题涉及到了数学和编程的结合,适用于算法竞赛和数学爱好者。
摘要由CSDN通过智能技术生成

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(H1)%MHA​​​​​​ .由于分针相对于时针的位置有两种,我们仅考虑右侧,另一侧对称可得。

g = gcd ⁡ ( H − 1 , M H ) g = \gcd(H - 1, MH) g=gcd(H1,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} tgH1%gMHgA ,此时 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 (gH1,gMH)=1​ ,那么原不等式等价于 t % M H g ⩽ A g t \% \frac{MH}{g}\leqslant \frac{A}{g} t%gMHgA

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=2gA+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(2gA+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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值