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 }
posted @ 2012-08-03 21:14  时光旅行的懒猫  阅读(242)  评论(0编辑  收藏  举报