C Looooops(poj 2115)
大致题意:
对于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
有了这些思想,设对于某组数据要循环x次结束,那么本题就很容易得到方程:
x=[(B-A+2^k)%2^k] /C
即 Cx=(B-A)(mod 2^k) 此方程为 模线性方程,本题就是求X的值。
//注意最后使x变为最小正整数的公式 #include<cstdio> #include<iostream> #define ll long long using namespace std; ll A,B,C,K; ll e_gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1;y=0; return a; } ll r=e_gcd(b,a%b,x,y); ll t=x;x=y;y=t-a/b*y; return r; } int main() { while(1) { cin>>A>>B>>C>>K; if(A==0&&B==0&&C==0&&K==0)break; if(A==B) { printf("0\n"); continue; } ll a=C,b=1LL<<K,c=B-A,x,y; ll gcd=e_gcd(a,b,x,y); if(c%gcd) { printf("FOREVER\n"); continue; } x=x*c/gcd; x=(x%(b/gcd)+(b/gcd))%(b/gcd); cout<<x<<endl; } }