http://162.105.81.212/JudgeOnline/problem?id=2115
从题目可以推出 a+c*x = b (mod 2^k) => c*x = (b-a) (mod 2^k)
经典的模线性方程求解;可能会有出组解,第一个解就是最小解,注意解小于0的情况。
#include <iostream> using namespace std; __int64 extended_euclid(__int64 a,__int64 b,__int64 &x,__int64 &y){ __int64 ret; if(b == 0) { x = 1; y = 0; return a; } ret = extended_euclid(b,a%b,x,y); __int64 t = x; x = y; y = t - a / b * y; return ret; } __int64 modular_linear(__int64 a,__int64 b,__int64 n){ __int64 x,y; __int64 d = extended_euclid(a,n,x,y); if(b%d) return -1; __int64 e = x * (b / d) % n + n; return e % (n / d); } int main() { __int64 A,B,C,K; while(scanf("%lld %lld %lld %lld",&A,&B,&C,&K),A||B||C||K) { __int64 d=modular_linear(C,B-A,(__int64)1<<K); if(d==-1) printf("FOREVER/n"); else printf("%lld/n",d); } return 0; }