这题只要知道知识点就能过,不知道就过不了……
题目大意:
给出一个for循环语句,for(i=A ; i!=B ;i +=C),问循环几次能结束。
这个是建立在变量是无符号k位的,即变量的数值在0到2的k次方之间,当超过2的k此方时,会溢出,也就是对2的k次方取余只有这样才有可能在有限次循环下结束。
解题思路:
通过这个for循环可以看出本题是求B-A+(2^k)*y=C*x求x的问题。
只要X有确定解就输出,无解就输出FOREVER。
然后就转换成了C*x=(B-A)mod(2^k);
求出最小的正整数x。
下面是代码:
#include <iostream>
using namespace std;
long long ext_gcd(long long a, long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long d=ext_gcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-a/b*y; //系数x、y的取值是为满足等式d=ax+by
return d;
}
int main()
{
long long a,b,c,k,d,n,x,y;
while(cin>>a>>b>>c>>k)
{
if(!a&&!b&&!c&&!k)
{
break;
}
n=1ll<<k;
d=ext_gcd(c,n,x,y);
if((b-a)%d)
{
cout <<"FOREVER"<<endl;
}
else
{
x=(x*(b-a)/d)%n;
x=(x%(n/d)+n/d)%(n/d);
cout <<x<<endl;
}
}
return 0;
}