POJ 2115 C Looooops
题目要求就是求满足A+C*x≡B mod 2^k,移向得C*x≡B-A mod 2^k,这也就变成了求解同余方程的问题,即求满足C*x+2^k*y=B-A的x和y。
类似于 青蛙的约会 那道题,令a=C,b=2^k,r=Gcd(a,b),扩展欧几里得算法求的是满足ax+by=gcd(a,b)的解,
所以最后的答案为x*(c/r)%(b/r)。
#include<complex> #include<cstdio> using namespace std; long long a,b,c,x,y; long long qread() { long long x=0; char ch=getchar(); while(ch<'0' || ch>'9')ch=getchar(); while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} return x; } long long Exgcd(long long a,long long b,long long &x,long long &y) { if(!b) { x=1;y=0; return a; } long long r=Exgcd(b,a%b,x,y),tmp=x; x=y;y=tmp-a/b*y; return r; } int main() { long long x1,x2; while(1) { x1=qread();x2=qread();a=qread();b=qread(); if(x1+x2+a+b==0)break; b=1ll<<b; long long r=Exgcd(a,b,x,y),c=x2-x1; if(c%r) { puts("FOREVER"); continue; } printf("%lld\n",(x*(c/r)%(b/r)+b/r)%(b/r)); } return 0; }