题目:传送门
题目大意:给出A,B,C,k,求循环for(varible=A;varible!=B;varible+=C)中的语句会执行多少次,注意数字是k-bit的,也就是说当数字大于 2k 时,又从0开始计数。
分析:设执行
x
次,
代码:
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
__int64 EXTENDED_EUCLID(__int64 a,__int64 b,__int64& x,__int64& y){
if(b==0){
x=1; y=0;
return a;
}
else{
__int64 d=EXTENDED_EUCLID(b,a%b,y,x);
y-=a/b*x;
return d;
}
}
int main(){
__int64 A,B,C,k;
while(cin>>A>>B>>C>>k,A||B||C||k){
__int64 b=B-A;
__int64 n=(__int64)1<<k;
__int64 a=C;
__int64 x,y;
__int64 d=EXTENDED_EUCLID(a,n,x,y);
if(b%d) cout<<"FOREVER"<<endl;
else{
__int64 xx=x*b/d%n,m=n/d;
__int64 ans=(xx%m+m)%m;
cout<<ans<<endl;
}
}
return 0;
}