POJ-2891 Strange Way to Express Integers 模线性方程组
题目链接:http://poj.org/problem?id=2891
题意:求解模线性方程组,且任意的ai可能不互质。
直接用扩展欧几里得求解就可了,具体可以看:http://www.cnblogs.com/zhsl/archive/2013/04/12/3017109.htm
1 //STATUS:C++_AC_0MS_196KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector> 10 #include<queue> 11 #include<stack> 12 #include<map> 13 using namespace std; 14 #define LL __int64 15 #define pii pair<int,int> 16 #define Max(a,b) ((a)>(b)?(a):(b)) 17 #define Min(a,b) ((a)<(b)?(a):(b)) 18 #define mem(a,b) memset(a,b,sizeof(a)) 19 #define lson l,mid,rt<<1 20 #define rson mid+1,r,rt<<1|1 21 const int N=110,INF=0x3f3f3f3f,MOD=10000,STA=8000010; 22 const double DNF=1e13; 23 24 LL a[N],m[N]; 25 int n; 26 27 void exgcd(LL a,LL b,LL& d,LL& x,LL& y) 28 { 29 if(!b){d=a;x=1;y=0;} 30 else {exgcd(b,a%b,d,y,x);y-=x*(a/b);} 31 } 32 33 LL Modline(int n) 34 { 35 LL d,x,y,A,M,Mod; 36 A=a[n-1],M=m[n-1]; 37 n--; 38 // m1*x-m2*y=a2-a1 39 while(n--){ 40 exgcd(M,m[n],d,x,y); 41 if((A-a[n])%d!=0){ 42 return -1; 43 } 44 Mod=m[n]/d; 45 x=(x*((a[n]-A)/d)%Mod+Mod)%Mod; 46 A+=M*x; 47 M=M/d*m[n]; 48 } 49 return A; 50 } 51 52 int main() 53 { 54 // freopen("in.txt","r",stdin); 55 int i,j; 56 while(~scanf("%d",&n)) 57 { 58 for(i=0;i<n;i++) 59 scanf("%I64d%64d",&m[i],&a[i]); 60 61 printf("%I64d\n",Modline(n)); 62 } 63 return 0; 64 }