Openjudge NOI题库 数论4975 两只鼹鼠
总时间限制: 1000ms 内存限制: 65536kB 描述 一个圆形花圃被分为k个扇形区域(0,1,…,k-1)。有两只小鼹鼠A,B分别位于其中的两个区域。鼹鼠从一个扇形区域移动到相邻的区域需要1分钟。已知A鼹鼠总是沿顺时针方向移动(序号增大),B鼹鼠总是沿逆时针方向移动(序号减小),两只鼹鼠都是每隔一段时间钻出地面一次。请你求出两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间。如果永远遇不到,则输出“no answer”。 输入 第一行为一个整数k,表示扇形区域的个数。1 <= k< = 10000 第二行为两个整数la,lb分别表示两只鼹鼠初始时所处的位置。0 <= la, lb < k。 第三行为两个整数sA,sB分别为两只鼹鼠钻出地面的间隔时间。0 < sA, sB < 100。 第四行为两个整数fa,fb分别为两只鼹鼠第一次钻出地面的时间。0 <= fa < sA, 0 <= fb < sB。 输出 用一个整数表示两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间。 若两只鼹鼠永远无法相遇,输出“no answer”。 样例输入 7 1 5 3 5 1 2 样例输出 37
分析:
转换模型——
不妨叫它“打地鼠”模型——你懂的
把圆形区域拉成无限长的数轴,A从SA开始,B从SB开始,每次钻出点为A=(la+fa+x*sA),B=(lb-fb-y*sB),其中x,y∈N*;解x,y满足:
1) A-SA==B-SB,经过的时间相同
2) (A-B)%k==0,A,B在圆上同一个位置
整理1)方程,
A-SA=B-sB
fa+x*sA= -fb-y*sB
x*sA= -fa-fb-y*sB
① |x*sA|=|y*sB+fa+fb|
② 即 sA的x倍数-(fa+fb) = sB的倍数;
整理2)方程
(A-B)%k=0
(la+fa+x*sA)-(lb-fb-y*sB)%k=0
( la-lb + x*sA + y*sB+fa+fb )%k==0
将①带入得
( la-lb + 2x*sA)%k==0
③ 即 sA的2x倍数+(la-lb)是k的倍数;
综上,于是我们可以从0开始枚举x,使得x同时满足②③即可。