中国剩余定理——解决对非质数的取余问题

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 using namespace std;
 5 const int N=107;
 6 int m[N];// 质除数
 7 int p[N];// 余数
 8 int e_gcd (int a,int b,int &x,int &y) {
 9     if (b==0) {
10         x=1;
11         y=0;
12         return a;
13     }                      // a*x1+b*y1=1;
14                            // a*y2+b*(x2-(a/b)*y2)=1 
15     int d=e_gcd (b,a%b,y,x);// 作用 :求出x2与y2 并且使y1=x2; x1=y2;
16     y=y-(a/b)*x;//y1=x2-(a/b)*y2;
17     return d;
18 }
19 int china (int m[],int p[],int n) {
20     int M=1;
21     for (int i=1;i<=n;i++)
22         M=M*m[i];
23     int ans=0;
24     for (int i=1;i<=n;i++) {
25         int a=M/m[i];
26         int x,y;
27         e_gcd (a,m[i],x,y);
28         x=x*p[i]*a;//important!!!
29         ans+=(x+M)%M;
30     }
31     return ans%M;
32 }
33 int main ()
34 {
35     int n;
36     cin>>n;
37     for (int i=1;i<=n;i++) {
38         cin>>m[i]>>p[i];
39     }
40     int ans=china (m,p,n);
41     cout<<ans<<endl;
42     return 0;
43 }
抓住青春的尾巴。。。
原文地址:https://www.cnblogs.com/xidian-mao/p/8468657.html