题目地址:
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 "); 51 else 52 { 53 ll q=m/p; 54 ll ans=(b/p*x%q+q)%q; 55 printf("%lld ",ans); 56 } 57 } 58 //clock_t ed=clock(); 59 //printf(" Time Used : %.5lf Ms. ",(double)(ed-st)/CLOCKS_PER_SEC); 60 return 0; 61 }