首页 > 代码库 > math2115

math2115

大致题意:

对于Cfor(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=ax=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;  //系数xy的取值是为满足等式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;//2K次方

 

 

// __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;

}

math2115