#tYybttg060408. 1638:五指山

1638:五指山

1638:五指山

题目描述

大圣在佛祖的手掌中。

我们假设佛祖的手掌是一个圆圈,圆圈的长为 nn,逆时针记为:0,1,2,,n10,1,2,\cdots,n-1,而大圣每次飞的距离为 dd。现在大圣所在的位置记为 xx,而大圣想去的地方在 yy。要你告诉大圣至少要飞多少次才能到达目的地。

输入格式

有多组测试数据。

第一行是一个正整数 TT,表示测试数据的组数;

每组测试数据包括一行,四个非负整数,分别为如来手掌圆圈的长度 nn,筋斗所能飞的距离 dd,大圣的初始位置 xx 和大圣想去的地方 yy

注意孙悟空的筋斗云只沿着逆时针方向翻。

输出格式

对于每组测试数据,输出一行,给出大圣最少要翻多少个筋斗云才能到达目的地。如果无论翻多少个筋斗云也不能到达,输出 Impossible

样例

样例输入 #1

2
3 2 0 2
3 2 0 1

样例输出 #1

1
2

样例解释 #1

第一组数据

  • n=3,d=2,x=0,y=2n=3, d=2, x=0, y=2
  • 大圣从 00 出发,每次逆时针飞 22 个单位。
  • 11 次:位置 (0+2)mod3=2(0+2) \bmod 3 = 2,到达 yy
  • 输出 11

第二组数据

  • n=3,d=2,x=0,y=1n=3, d=2, x=0, y=1
  • 11 次:到 22,不是 11
  • 22 次:位置 (0+2×2)mod3=4mod3=1(0+2\times2) \bmod 3 = 4 \bmod 3 = 1,到达 yy
  • 输出 22

数据范围

对于全部数据:

  • 2<n<1092 < n < 10^9
  • 0<d<n0 < d < n
  • 0x,y<n0 \le x, y < n

时空限制

  • 时间限制:1000 ms
  • 内存限制:524288 KB

注意:本题实质是求解线性同余方程。设大圣飞了 tt 次,则位置为 (x+dt)modn=y(x + d \cdot t) \bmod n = y。即:

x+dty(modn)x + d \cdot t \equiv y \pmod{n}

移项得:

dtyx(modn)d \cdot t \equiv y - x \pmod{n}

a=da = d, b=yxb = y - x,则方程为 atb(modn)a t \equiv b \pmod{n}。要求最小正整数解 tt

解法:

  1. 计算 g=gcd(a,n)g = \gcd(a, n)
  2. 如果 bb 不能被 gg 整除,则无解,输出 Impossible
  3. 否则,方程两边同除以 gg,得到 atb(modn)a' t \equiv b' \pmod{n'},其中 a=a/ga' = a/g, b=b/gb' = b/g, n=n/gn' = n/g
  4. 由于 gcd(a,n)=1\gcd(a', n') = 1,用扩展欧几里得算法求 aa' 在模 nn' 下的逆元 invinv,则 tbinv(modn)t \equiv b' \cdot inv \pmod{n'}
  5. 最小正整数解为 t=(binvmodn+n)modnt = (b' \cdot inv \bmod n' + n') \bmod n'

注意:b=yxb = y - x 可能为负数,需要调整为模 nn 下的非负剩余:b=(yx+n)modnb = (y - x + n) \bmod n。但直接计算 b=yxb = y - x,然后在同余方程中处理负数即可(扩展欧几里得算法允许负数)。

由于 nn 可能很大(10910^9),但 TT 不会太大(题目未给出,但通常不会很多),扩展欧几里得算法复杂度 O(logn)O(\log n),可以接受。

注意:如果 b=0b = 0,即 xy(modn)x \equiv y \pmod{n},则 t=0t=0 是一个解,但 t=0t=0 表示不飞,题目可能要求至少飞一次?但题目要求“最少要翻多少个筋斗云”,如果初始位置就是目的地,那么 t=0t=0 应该是答案。但样例中没有这种情况。我们输出 00 即可。

另外,注意 dd 可能为 00?数据范围 0<d<n0 < d < n,所以 d>0d > 0,不会为 00