这题的题意不难理解,对C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。若在有限次内结束,则输出循环次数。否则输出死循环。但是问题来了,这里涉及到了同余方程的求解问题,这就要用扩展欧几里得算法,然后就要各种用公式,之前有一道青蛙约会的那题poj1061,用的做法也差不多。本题是要求解(a+c*x)mod2^k=b,求x的最小解,变式得 c*x=(b-a)mod2^k。参考《算法导论》,引入欧几里得扩展方程 d=ax+by,求解d,x,y。
代码如下
#include<stdio.h>
#include<math.h>__int64 x,y;
__int64 extgcd(__int64 a,__int64 b)
{
__int64 d,xt;
if(b==0)
{
x=1;
y=0;
return a;
}
d=extgcd(b,a%b);
xt=x;
x=y;
y=xt-a/b*y;
return d;
}
void main()
{
__int64 A,B,C,k,a,b,n,d;
while(scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k))
{
if(A==0&&B==0&&C==0&&k==0)
break;
a=C;
b=B-A;
n=pow((__int64)2,k);
d=extgcd(a,n);
if(b%d!=0)
printf("FOREVER\n");
else
{
x=(x*(b/d))%n;
x=(x%(n/d)+n/d)%(n/d);
printf("%I64d\n",x);
}
}
}