[51Nod](1079)中國剩餘定理 ---- 數論
阿新 • • 發佈:2019-02-10
一個正整數K,給出K Mod 一些質數的結果,求符合條件的最小的K。例如,K % 2 = 1, K % 3 = 2, K % 5 = 3。符合條件的最小的K = 23。
Input
第1行:1個數N表示後面輸入的質數及模的數量。(2 <= N <= 10)
第2 - N + 1行,每行2個數P和M,中間用空格分隔,P是質數,M是K % P的結果。(2 <= P <= 100, 0 <= K < P)
Output
輸出符合條件的最小的K。資料中所有K均小於10^9。
Input示例
3
2 1
3 2
5 3
Output示例
23
模板題
AC程式碼:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define rev(i,s,e) for(int i=e;i>=s;i--)
#define all(x) x.begin(),x.end()
#define sz(x) x.size()
#define szz(x) int(x.size()-1)
const int INF = 0x3f3f3f3f ;
const int MOD = 1e9+7;
const int MAXN = 2e5+10;
typedef long long LL;
void exgcd(LL a,LL b,LL &x,LL &y,LL &d)
{
if(!b) d = a,x=1,y=0;
else exgcd(b,a%b,y,x,d),y-=(a/b)*x;
}
LL inv(LL a,LL p)
{
LL x,y,d;
exgcd(a,p,x,y,d);
return d == 1?(x%p+p)%p:-1;
}
LL china(int n,LL *a,LL *m)
{
LL M = 1 , res = 0;
rep(i,0,n-1) M*=m[i];
rep(i,0,n-1)
{
LL w = M/m[i];
res = (res + a[i]*w*inv(w,m[i]))%M;
}
return (res+M)%M;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL a[15],m[15];
int n;
cin>>n;
rep(i,0,n-1) cin>>m[i]>>a[i];
cout<<china(n,a,m)<<endl;
return 0;
}