一个正整数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 }