http://poj.org/problem?id=2115
for (variable = A; variable != B; variable += C)问你要执行多少次,循环才会停止,不会停止输出forever
输入abck;
mod=1<<k;
也就是 (a+b*x)%mod==c
// (x*c+a)%(1<<k)==b
//即 (x*c+a)与b同余 (1<<k)
//即 (x*c)与b-a同余 (1<<k)
//即解c*x%mod==b-a
//即c*x-y*mod==b-a 用扩展欧几里德算法解得X*c+Y*mod=1的X
// 则x=X*(b-a),当然有解的前提是 (b-a)%gcd(c,mod)==0
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
__int64 k,a,b,c;
// (x*c+a)%(1<<k)==b
//即 (x*c+a)与b同余 (1<<k)
//即 (x*c)与b-a同余 (1<<k)
//即解c*x%mod==b-a
//即c*x-y*mod==b-a 用扩展欧几里德算法解得X*c+Y*mod=1的X
// 则x=X*(b-a),当然有解的前提是 (b-a)%gcd(c,mod)==0
__int64 t,p;
__int64 gd ;
void extend_euild(__int64 a, __int64 b)
{
if (b==0)
{
t=1;
p=0;
gd=a;
}
else
{
extend_euild(b,a%b);
__int64 tmp=t;
t=p;
p=tmp-a/b*p;
}
}
__int64 one=1;
int main()
{
while( scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k)!=EOF)
{
if (!a&&!b&&!c&&!k) break;
__int64 n=one<<k;
__int64 d=b-a;
if (d==0)
{ printf("0\n");continue;}
extend_euild(c,n);
if (d%gd==0)
{
d/=gd;
c/=gd;
n/=gd;
t*=d;
t=t%n+n;
printf("%I64d\n",t%n);
}
else printf("FOREVER\n");
}
return 0;
}