#tYybttg060410. 1639:Biorhythms

1639:Biorhythms

1640:C Looooops

题目描述

对于 C 语言的

for (variable = A; variable != B; variable += C)
  statement;

循环语句,问在 kk 位存储系统中循环几次才会结束。若在有限次内结束,则输出循环次数。否则输出死循环。

输入格式

多组数据,每组数据一行四个整数 A,B,C,kA, B, C, kkk 表示 kk 位存储系统。

读入以 0 0 0 0 结束。

输出格式

若在有限次内结束,则输出循环次数。否则输出 FOREVER

样例

样例输入 #1

3 3 2 16
3 7 2 16
7 3 2 16
3 4 2 16
0 0 0 0

样例输出 #1

0
2
32766
FOREVER

样例解释 #1

第一组A=3,B=3,C=2,k=16A=3, B=3, C=2, k=16。初始值 A=BA=B,所以循环次数为 00(因为一开始就满足 variable == B,不执行循环体)。输出 00

第二组A=3,B=7,C=2,k=16A=3, B=7, C=2, k=16。在 1616 位存储系统中,整数范围为 002161=655352^{16}-1 = 65535,且是模 2162^{16} 的运算。循环条件 variable != B,每次增加 C=2C=2。相当于解方程 A+CtB(mod2k)A + C \cdot t \equiv B \pmod{2^k},求最小非负整数 tt。方程:3+2t7(mod65536)3 + 2t \equiv 7 \pmod{65536},即 2t4(mod65536)2t \equiv 4 \pmod{65536}。解得 t=2t=2(因为 2×2=42 \times 2 = 4)。输出 22

第三组A=7,B=3,C=2,k=16A=7, B=3, C=2, k=16。方程:7+2t3(mod65536)7 + 2t \equiv 3 \pmod{65536},即 2t465532(mod65536)2t \equiv -4 \equiv 65532 \pmod{65536}。注意 4mod65536=65532-4 \bmod 65536 = 65532。方程 2t65532(mod65536)2t \equiv 65532 \pmod{65536}。由于 gcd(2,65536)=2\gcd(2,65536)=2,且 6553265532 能被 22 整除,有解。化简为 t32766(mod32768)t \equiv 32766 \pmod{32768}。最小非负解 t=32766t=32766。输出 3276632766

第四组A=3,B=4,C=2,k=16A=3, B=4, C=2, k=16。方程:3+2t4(mod65536)3 + 2t \equiv 4 \pmod{65536},即 2t1(mod65536)2t \equiv 1 \pmod{65536}。由于 gcd(2,65536)=2\gcd(2,65536)=211 不能被 22 整除,无解。所以死循环,输出 FOREVER

数据范围

对于全部数据:

  • 1k321 \le k \le 32
  • 0A,B,C<2k0 \le A, B, C < 2^k

时空限制

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

注意:本题是求解线性同余方程。设循环次数为 tt,则经过 tt 次循环后,变量值为 A+CtA + C \cdot t(在 kk 位存储系统中,整数运算是模 2k2^k 的)。循环结束条件是 A+CtB(mod2k)A + C \cdot t \equiv B \pmod{2^k},即

CtBA(mod2k)C \cdot t \equiv B - A \pmod{2^k}

a=Ca = Cb=BAb = B - An=2kn = 2^k,则方程为 atb(modn)a t \equiv b \pmod{n}

求解步骤:

  1. 计算 d=gcd(a,n)d = \gcd(a, n)
  2. 如果 bb 不能被 dd 整除,则无解,输出 FOREVER
  3. 否则,方程两边同除以 dd,得到 atb(modn)a' t \equiv b' \pmod{n'},其中 a=a/da' = a/db=b/db' = b/dn=n/dn' = n/d
  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'

注意:n=2kn = 2^k 可能很大(kk 最大 3232n=232=4294967296n = 2^{32} = 4294967296),但 a,ba, b 也在 [0,2k)[0, 2^k) 范围内。计算 gcd\gcd 和扩展欧几里得时用 long long(64 位)即可。

特殊情形:

  • 如果 A==BA == B,则 t=0t=0,直接输出 00(因为一开始就相等,循环次数为 00)。
  • 如果 C==0C == 0,则每次增加 00,变量不变。如果 A==BA == B,则 t=0t=0;否则永远无法等于 BB,死循环。

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

多组数据,直到输入 0 0 0 0 结束。