2020 ICPC 沈阳站 - I题 - Rise of Shadows (数论 | 同余+剩余系)

传送门:I题
题意: 一个时钟,时针走一圈就是一天,现在给定时针走一圈要H小时,分针走一圈要M分钟,设 α = 2 π A H M α=\frac{2πA}{HM} α=HM2πA ,求一天中时针和分针夹角小于等于α的时刻有几次。

这题首先有如下几个注意点:
①分针是按照刻度一格一格走的,因此不能将小数的分钟算入,必须是整的(即不能按照角度来求)。
②两者成角度会有两种情况,分针在时针左边成角度 or 在时针右边成角度

请添加图片描述

切入点: 一般会最先想到用追及问题的角度去做,但是这样就有两个变量(涉及到分针和时针两个对象),所以我们可以选择将时针作为参照物 (参照物静止不动),运用相对速度只对分针这一个对象做分析。

两者绝对速度: v h 绝 对 v_{h绝对} vh = 2 π H M \frac{2π}{HM} HM2π v m 绝 对 v_{m绝对} vm = 2 π M \frac{2π}{M} M2π
分针相对速度: v m 相 对 = v m 绝 对 − v h 绝 对 = 2 π H M ∗ ( H − 1 ) = ( H − 1 ) v h 绝 对 v_{m相对}=v_{m绝对}-v_{h绝对}=\frac{2π}{HM}*(H-1)=(H-1)v_{h绝对} vm=vmvh=HM2π(H1)=(H1)vh
即分针相对于时针以 H − 1 / m i n H−1 / min H1/min 的恒定速度运动。

要使两者之间夹角小于等于α,也就相当于追及问题中的两针“路程差”≤α,而此处因为时针作为参照物了,所以也就转化成了分针的“路程”≤α= 2 π A H M = A ∗ v h 绝 对 \frac{2πA}{HM}=A*v_{h绝对} HM2πA=Avh
因此我们可以写出一个关于时间 t ∈ [ 0 , H M ) t∈[0,HM) t[0,HM) 的不等式:
t ∗ * (H-1) v h 绝 对 v_{h绝对} vh mod HM ≤ |α|=|A ∗ v h 绝 对 *v_{h绝对} vh|
t ∗ * (H-1) mod HM ≤ | A A A|

根据剩余系定理三:
“若a,b,c为任意3个整数,m为正整数,且(m,c)=1,则当ac≡bc(mod m)时,有a≡b(mod m)”
所以为了满足互质,可将不等式两边同除以 g = g c d ( H − 1 , H M ) g=gcd(H-1,HM) g=gcd(H1,HM) ,不等式可等价为:
t ∗ * H − 1 g \frac{H-1}{g} gH1 mod H M g \frac{HM}{g} gHM ≤ | A g \frac{A}{g} gA|
− A g \frac{-A}{g} gA ≤ t ∗ * H − 1 g \frac{H-1}{g} gH1 mod H M g \frac{HM}{g} gHM A g \frac{A}{g} gA
------------注意:此处t的取值范围也同时从 [ 0 , HM ) 缩小到 [ 0 , H M g \frac{HM}{g} gHM )-----------

下面就只需求解出 t 的整数解的个数,即为满足条件的时刻的次数。我画在数轴上会比较直观。只需求出正半轴有几个整数解,然后个数 ∗ * 2并且加上零解。

请添加图片描述

正半轴:因为要mod之后余数≤ A g \frac{A}{g} gA ,因此一共有余数为1,2,3… A g \frac{A}{g} gA 的共计 A g \frac{A}{g} gA 个解,并且这些解中没有重复的,即t的值与余数取值一 一对应,下证:
令a= H − 1 g \frac{H-1}{g} gH1,b= H M g \frac{HM}{g} gHM
假设存在 t 1 t_1 t1 t 2 t_2 t2两个不同的值满足: t 1 ∗ a t_1*a t1a mod b b b t 2 ∗ a t_2*a t2a mod b b b ,并且 t ∈ [ 0 , b ] t∈[0,b] t[0,b] ,因此根据同余定义,易证 t 1 = t 2 t_1=t_2 t1=t2 ,与假设矛盾,因此每个t的解所对应的余数一定是各不相同的。

所以在 t∈[ 0 , H M g \frac{HM}{g} gHM ) 的范围内一共有 2 ∗ ( A g ) + 1 2*(\frac{A}{g})+1 2(gA)+1 个不同整数解。把范围还原到 [ 0 , HM ) ,就共有 g ∗ [ 2 ∗ ( A g ) + 1 ] g*[2*(\frac{A}{g})+1] g[2(gA)+1] 个不同整数解,也就是本题答案之一。

有一种情况需要特判,就是当 A = H M 2 A=\frac{HM}{2} A=2HM ,这时α=π ,t ∈ [ 0 , HM )中的每个整数都满足条件,故答案为 H M HM HM

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll h,m,a;
int main()
{
    scanf("%lld%lld%lld",&h,&m,&a);
    ll g=__gcd(h-1,h*m);
    if(a==h*m/2)  printf("%lld",h*m);
    else printf("%lld",g*(2*(a/g)+1));
    return 0;
}
  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值