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 }

你可能感兴趣的:(oop)