1079 中国剩余定理(模板)

一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K。例如,K % 2 = 1, K % 3 = 2, K % 5 = 3。符合条件的最小的K = 23。
 

输入

第1行:1个数N表示后面输入的质数及模的数量。(2 <= N <= 10)
第2 - N + 1行,每行2个数P和M,中间用空格分隔,P是质数,M是K % P的结果。(2 <= P <= 100, 0 <= K < P)

输出

输出符合条件的最小的K。数据中所有K均小于10^9。

输入样例

3
2 1
3 2
5 3

输出样例

23

基础知识:

x≡a1( mod m1) x≡a2( mod m2) ......x≡an( mod  mn);

其中,m1.m2,m3.....,mn是两两互质的整数

令M=(m1*m2*m3....*mn);

Mi=M/mi, ti是方程Mi*ti≡1(mod mi)的一个解

那么x有整数解,解为x = 求和1~n(ai*Mi*ti);

证明如下:

因为Mi=m/mi 是除了mi之外所有模数的倍数 所以如果代入x=Σ(1~n) ai*Mi*ti,原方程组成立

可以理解为每个aiMiti只对i这个方程有贡献,对其他方程都没有影响

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll arr[15],brr[15];
 5 int n;
 6 ll X,Y;
 7 ll gdc(ll a,ll b) { return b==0?a:gdc(b,a%b); }
 8 void exgdc(ll a,ll b,ll &X,ll &Y){
 9     if(b==0){
10         X=1,Y=0;return;
11     }
12     exgdc(b,a%b,X,Y);
13     ll temp=X;
14     X=Y;
15     Y=temp-a/b*Y;
16 }
17 
18 
19 int main(){
20     ios::sync_with_stdio(false);
21     cin>>n;
22     ll lcm=1;
23     for(int i=1;i<=n;i++){
24         cin>>arr[i]>>brr[i];
25         lcm*=arr[i];
26     }
27     ll res=0;
28     for(int i=1;i<=n;i++){
29         exgdc(lcm/arr[i],arr[i],X,Y);
30         X=(X+arr[i])%(arr[i]);
31         res=(res+brr[i]*X*lcm/arr[i]);
32     }
33     cout << res%lcm << endl;
34     return 0;
35 }
View Code

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/11521372.html