大概意思是有一个C/C++的循环语句
for(i=a;i!=b;i=i+c)然后这个i是个最大为2^k的数
也就是说如果i>=2^k就会减少2^k
求这个循环语句循环多少次会跳出 如果不能就输出FOREVER
显然可以转化成 b与a+cx同余2^k相等的最小正整数的解
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL exgcd(LL &x,LL &y,LL a,LL b)
{
if(b==0)
{
x=1;y=0;
return a;
}
LL d=exgcd(x,y,b,a%b);
LL px=x;
x=y;
y=px-a/b*y;
return d;
}
LL A,B,C,k;
int main()
{
while(scanf("%lld%lld%lld%lld",&A,&B,&C,&k)==4)
{
if(!A&&!B&&!C&&!k)break;
LL a,b,c,d,x,y;
a=C;
b=1ll<<k;
c=B-A;
d=exgcd(x,y,a,b);
if(c%d!=0)puts("FOREVER");
else
{
x=x*(c/d);
x=((x%(b/d))+(b/d))%(b/d);
printf("%lld\n",x);
}
}
return 0;
}