POJ 2115 C Looooops
题目链接http://poj.org/problem?id=2115
拓展欧几里得算法+线性同余方程
题目大意是问A经过多少次能到达B, 当A的值大于 2^k时 A = A%2^k;
从题目中可以得到方程: a + c*x = b (mod 2^k) 变形得 c*x = (b-a) (mod 2^k); 再变形得: c*x – 2^k*y = (b – a)
解扩展欧几里德方程就可以了
View Code
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 __int64 ext_gct(__int64 a,__int64 b,__int64& x,__int64& y) 5 { 6 if(b==0) 7 { 8 x=1; 9 y=0; 10 return a; 11 } 12 __int64 d=ext_gct(b,a%b,x,y); 13 __int64 xt=x; 14 x=y; 15 y=xt-a/b*y; 16 return d; 17 } 18 19 int main() 20 { 21 __int64 A,B,C,k; 22 while(scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k)) 23 { 24 if(!A && !B && !C && !k) 25 break; 26 __int64 a=C; 27 __int64 b=B-A; 28 __int64 n=(__int64)1<<k; 29 __int64 x,y; 30 __int64 d=ext_gct(a,n,x,y); 31 32 if(b%d!=0) 33 cout<<"FOREVER"<<endl; 34 else 35 { 36 x=(x*(b/d))%n; 37 x=(x%(n/d)+n/d)%(n/d); 38 printf("%I64d\n",x); 39 } 40 } 41 return 0; 42 }