大致题意:
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
解题思路:
题意不难理解,只是利用了 k位存储系统 的数据特性进行循环。
例如int型是16位的,那么int能保存2^16个数据,即最大数为65535(本题默认为无符号),
当循环使得i超过65535时,则i会返回0重新开始计数
如i=65534,当i+=3时,i=1
其实就是 i=(65534+3)%(2^16)=1
#include<cstdio>
#include<cstring>
#include<cmath>
__int64 EXTENDED_EUCLID(__int64 a,__int64 b,__int64& x,__int64& y)
{//把gcd,exgcd合并在一个函数,可以减少递归次数
if(b==0)
{
x=1;
y=0;
return a; //d=a,x=1,y=0,此时等式d=ax+by成立
}
__int64 d=EXTENDED_EUCLID(b,a%b,x,y);
__int64 xt=x;
x=y;
y=xt-a/b*y; //系数x、y的取值是为满足等式d=ax+by
return d;
}
int main()
{
__int64 a,b,c,k;
__int64 x,y;
while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k),a && b && c && k)
{
__int64 total=(__int64)1<<k;//2的K次方
// __int64 m_gcd=gcd(c,total);
__int64 m_gcd=EXTENDED_EUCLID(c,total,x,y);
__int64 youbian=b-a;
if(youbian%m_gcd)
printf("FOREVER\n");
else
{
x=(x*youbian/m_gcd)%(total/m_gcd);
///x在[0,b/gcd(a,b)-1]有唯一解
if(x<0)
x+=total/m_gcd;
printf("%I64d\n",x);
}
}
return 1;
}