转化成求解a+cx=b(mod 2^k)的最小整数解,还是求解一次同余式 注意当k=32时,int会溢出 代码: #include<iostream> using namespace std; __int64 a,b,c,k,i,d,x,y,ans; __int64 extended_eculid(__int64 a,__int64 b,__int64 &x,__int64 &y) { if(b==0) { x=1; y=0; return a; } __int64 t,res; res=extended_eculid(b,a%b,x,y); t=x; x=y; y=t-a/b*y; return res; } int main() { while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&i)) { if(a==0&&b==0&&c==0&&i==0) break; k=((__int64)1)<<i; b-=a; d=extended_eculid(c,k,x,y); if(b%d!=0) { printf("FOREVER/n"); continue; } ans=x*b/d; k/=d; ans=(ans%k+k)%k; cout<<ans<<endl; } return 0; }