__int64 t=1<<k; 本来t有64位,k可以取(0-62),但这里因为编译器会把常量1当成int处理,所以当k>30就会出现问题。 正确的写法是 __int64 t=(__int64)1<<k; #include <iostream> using namespace std; __int64 exGcd(__int64 a,__int64 b,__int64& x,__int64& y) { if(b==0) { x=1; y=0; return a; } __int64 r=exGcd(b,a%b,x,y); __int64 t=x; x=y; y=t-a/b*y; return r; } void liner_equation_solver(__int64 a,__int64 b,__int64 n) { __int64 x,y,d; a=a%n; if(a<0) a+=n; b=b%n; if(b<0) b+=n; d=exGcd(a,n,x,y); if(b%d) printf("FOREVER/n"); else { x=x*b/d; x=x%n; if(x<0) x+=n; while(x>=n/d) { x-=n/d; } printf("%I64d/n",x); } } int main() { __int64 A,B,C,k,t; while(scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k)) { if(A==0&&B==0&&C==0&&k==0) return 0; t=(__int64)1<<k; liner_equation_solver(C,B-A,t); } return 0; }