1. 程式人生 > >[51Nod](1079)中國剩餘定理 ---- 數論

[51Nod](1079)中國剩餘定理 ---- 數論

一個正整數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; }