题目描述:
一个C语言的for循环:
for(int i=A;i!=B;i+=C)st;
其中i表示变量,A、B和C分别表示初值、终值和步长,st表示循环体。 要求计算当循环变量i运算在k位无符号整数体系下(运算值范围:0~2^k-1,此时,i+=c溢出后截断),循环体st会执行多少次?
输入格式 输入每组数据包括4个整数A,B,C和k。
输出格式 对于每组数据,输出循环次数,注意循环次数不能是负值,如果永远不能结束,输出FOREVER。
代码:
#include<iostream>
#define ll long long
using namespace std;
ll a1,b1,c1,k1;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1;y=0;return a;}
ll temp=exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
return temp;
}
int main(){
cin>>a1>>b1>>c1>>k1;
while(!(a1==0&&b1==0&&c1==0&&k1==0)){
ll a=c1,b=(1<<k1),c=b1-a1,x,y;
ll t1=exgcd(a,b,x,y);
if(c%t1) cout<<"FOREVER";
else{
ll x1=c/t1*x,bu=b/t1;
if(bu<0) bu*=-1;
x1=(x1%bu+bu)%bu;
cout<<x1;
}
puts("");
cin>>a1>>b1>>c1>>k1;
}
return 0;
}
//c1*c+y*2^k1=b1-a1