您的位置:首页 > 其它

中国剩余定理CRT (互质)

2016-07-15 17:40 302 查看
中国剩余定理给出了以下的一元线性同余方程组:



有解的判定条件,并用构造法给出了在有解情况下解的具体形式。

中国剩余定理说明:假设整数m1,m2, … ,mn两两互质,则对任意的整数:a1,a2, … ,an,方程组 有解,并且通解可以用如下方式构造得到:

设M是整数m1,m2, … ,mn的乘积,并设Mi是除了mi以外的n- 1个整数的乘积。

设为Mi^-1模mi的数论倒数 :

方程组的通解形式为

:在模M的意义下,方程组

只有一个解:

例题 POJ 1006

51nod 1079

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll ;
ll exgcd(ll a ,ll b , ll &x ,ll &y ) {
if(!b) {
x = 1 , y = 0 ;
return a ;
}
else {
ll d = exgcd(b,a%b,x,y) ;
ll t = x ;
x = y ;
y = t - a/b*y ;
return d ;
}
}
int main() {
ll n ;
while(~scanf("%lld",&n)){
vector<ll> p,m,a;
p.clear() ; m.clear() ; a.clear() ;
long long M = 1 , ans = 0 ;
for(ll pi,ai,i=0 ; i<n ; ++i){
scanf("%lld%lld",&pi,&ai) ;
p.push_back(pi) ;
a.push_back(ai) ;
M *= pi ;
}
for(ll i=0 ; i<n; ++i){
m.push_back(M/p[i]) ;
ll x ,y ;
exgcd(m[i],p[i],x,y) ;
if(x<0)x+=p[i] ;
// cout << x << " " << y <<endl ;
ans = (ans+a[i]*x*m[i])%M;
//cout << ans << endl;
}
//        ans = (ans+M)%M ;
std::cout<<ans<<std::endl;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: