C Looooops
题目描述
对于C的for(i=A ; i!=B ;i +=C)循环语句,给出A,B,C和k(k表示变量是在k位操作系统下的无符号整数),判断循环次数,不能终止输出”FOREVER”.
输入
多组数据,每组一行,A,B,C,k
程序以0 0 0 0结束
输出
一行一个整数,表示循环次数,或者”FOREVER”
样例输入
3 3 2 16
3 7 2 16
7 3 2 16
3 4 2 16
0 0 0 0
样例输出
0
2
32766
FOREVER
提示
对于100%的数据满足:0 <= A, B, C < 2k,1 <= k <= 32。
从题面可知
需要求解 (A+ x*C)%mod=B
C * x+mod * y=B-A=gcd(C,mod)*[(B-A)/gcd(C,mod)]
用扩展欧几里德定理 需要求C * x + mod * y = gcd(C , mod)
a = C, b = mod
即模线性方程
代码
不建议Ctrl C+Ctrl V ! ! !
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0) {
x=1;
y=0;
return a;
}
ll ans=exgcd(b,a%b,x,y);
ll temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
int main()
{
ll a,b,c,d,k,A,B,C,X,Y;
while(1) {
cin>>a>>b>>c>>k;
if(a==0&&b==0&&c==0&&k==0)
break;
C=b-a;
A=c;
B=(ll)1<<k;
if(C<0) {
C+=B;
}
d=exgcd(A,B,X,Y);
if(C%d!=0) {
printf("FOREVER\n");
}
else{
ll t=B/d;
ll ans=(X*C/d)%B;
ans=(ans%t+t)%t;
cout<<ans<<endl;
}
}
}
“`