POJ2115解题报告【拓展欧几里得模板题】

题目地址:

  http://poj.org/problem?id=2115

题目概述:

  求解线性同余方程:

 

大致思路:

  这是个模板题,用拓展欧几里得即可解决。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <ctime>
 7 #include <map>
 8 #include <stack>
 9 #include <set>
10 #include <queue>
11 #include <cstring>
12 #include <algorithm>
13 using namespace std;
14 
15 #define sacnf scanf
16 #define scnaf scanf
17 #define maxn 47780
18 #define maxm 35
19 #define inf 1061109567
20 #define Eps 0.000001
21 const double PI=acos(-1.0);
22 #define mod 1000000007
23 #define MAXNUM 10000
24 void Swap(int &a,int &b) {int t=a;a=b;b=t;}
25 int Abs(int x) {return (x<0)?-x:x;}
26 typedef long long ll;
27 
28 ll P[maxm];
29 
30 ll ex_gcd(ll a,ll b,ll &x,ll &y)
31 {
32     if(b==0) {x=1;y=0;return a;}
33     ll ans=ex_gcd(b,a%b,x,y);
34     ll temp=x;x=y;y=temp-(a/b)*y;
35     return ans;
36 }
37 
38 int main()
39 {
40     //freopen("data.in","r",stdin);
41     //freopen("data.out","w",stdout);
42     //clock_t st=clock();
43     ll a,b,c,m,x,y;int k;
44     P[0]=1;for(int i=1;i<=32;i++) P[i]=P[i-1]*2;
45     while(~scanf("%lld%lld%lld",&a,&b,&c))
46     {
47         scanf("%d",&k);
48         if(a==0&&b==0&&c==0&&c==0) break;
49         m=P[k];b=(b-a+m)%m;ll p=ex_gcd(c,m,x,y);
50         if(b%p!=0) printf("FOREVER\n");
51         else
52         {
53             ll q=m/p;
54             ll ans=(b/p*x%q+q)%q;
55             printf("%lld\n",ans);
56         }
57     }
58     //clock_t ed=clock();
59     //printf("\n\nTime Used : %.5lf Ms.\n",(double)(ed-st)/CLOCKS_PER_SEC);
60     return 0;
61 }

 

posted @ 2017-05-19 10:35  CtrlKismet  阅读(208)  评论(0编辑  收藏  举报