您的位置:首页 > 其它

中国剩余定理

2016-04-11 20:21 429 查看
若m1,m2,m3,...mr是两两互素的正整数,则同余方程组x=a1(mod m1),x=a2(mod m2),x=a3(mod m3)...x=ar(mod mr)

 有模M=m1,m2,m3,....mr的唯一解,即为中国剩余定理。

令Mi=M/mi,因为m1,m2,m3,...mr两两互素,因此(Mi,mi)=1,即MiPi=1(mod mi);

a1M1P1+a2M2P2+a3M3P3+....+arMrPr,就是同余方程组的解。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#define LL long long
#include<iostream>
using namespace std;
int m[100],a[100],M;
int exgcd(int a,int b,int &x,int &y)
{
int x1,y1;
if(b==0)
{
x=1,y=0;
return a;
}
int r=exgcd(b,a%b,x1,y1);
x=y1;
y=x1-a/b*y1;
return r;
}
int ch_reminder(int len)
{
int i,Mi,x,y,d,ans=0;
M=1;
for(i=0;i<len;i++)
M*=m[i];
for(i=0;i<len;i++)
{
Mi=M/m[i];
exgcd(Mi,m[i],x,y);
ans=(ans+Mi*x*a[i])%M;
}
if(ans<0)
ans+=M;
return ans;
}
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>m[i]>>a[i];//m[i]:除数;a[i]:余数。
int ans=ch_reminder(n);
cout<<ans<<endl;
return 0;
}


                                                                                
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: