题意:A + nC = B (mod 1 << k)
思路典型的线性同余方程
不知道怎么解的看这里:线性方程求解 http://blog.csdn.net/leonharetd/article/details/13090883
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long int64;
int64 Exgcd(int64 a,int64 b,int64& x,int64& y)
{
if(b == 0)
{
x = 1,y = 0;
return a;
}
else
{
int r = Exgcd(b,a%b,x,y);
int temp = x;
x = y,y = temp - a/b*y;
return r;
}
}
int main()
{
int64 A,B,C,k;
while(scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k) != EOF)
{
if(A == 0 && B == 0 && C == 0 && k == 0)
break;
int64 M = (int64)1 << k;
int64 a,b,c,d,x,y;
a = C,b = M, c = B - A;
d = Exgcd(a,b,x,y);
if(c % d != 0)
{
printf("FOREVER\n");
}
else
{
x = x * (c/d);
b = b / d;
x = ( x % b + b ) % b;
printf("%I64d\n",x);
}
}
return 0;
}