题目:
for (variable = A; variable != B; variable += C)statement;
对于变量variable,在模1<<k的意义下,进行以上的循环,计算statement的计算次数,如果计算次数无限,输出“FOREVER”
INPUT:
一行四个数A,B,C,k,以0,0,0,0结尾(0<=A,B,C<(1<<K))
OUTPUT:
一行对应一组的答案
分析:
得到方程:A+C*x≡B(mod 1<<k)
A+C*x=B+(1<<k)*y
C*x+(1<<k)*y=B-A
扩展欧几里得求解该方程中的x即可,x应该是最小正整数解
还要注意对于int,好像1<<31就溢出了,所以前面加一个(ll)
代码:
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
void exgcd(ll a,ll b,ll& d,ll& x, ll& y){
if(b==0){
d=a;x=1;y=0;
}
else{
exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
}
int main(){
ll a,b,c,k;
while(cin>>a>>b>>c>>k){
if(a==0&&b==0&&c==0&&k==0)break;
ll r=b-a,d,x,y;
exgcd(c,(ll)1<<k,d,x,y);
if(r%d){
cout<<"FOREVER"<<endl;
continue;
}
x*=r/d;
ll m=((ll)1<<k)/d;
x=(x%m+m)%m;
cout<<x<<endl;
}
return 0;
}