中国剩余定理
用来求解同余方程组的最小非负整数解,其中 都互质
首先让 M 等于所有 的最小公倍数,对于求解每一个的方程
先设一个 ,再求解其逆元
则会有一组最小解
其通解就是
如果没有看懂,可以看详细求解同余方程这一篇博客
代码
数论大法好,人间真善美。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1007] , m[1007] ;
int n , ans , M =1 ;
int exgcd( int a , int b , int &x , int &y ) //扩展欧几里得
{
if( b ==0 ) {
x = 1;
y = 0;
return a;
}
else {
int u = exgcd( b , a%b , y , x );
y -= (a/b)*x ;
return u;
}
}
void China()
{
for(int i = 1 ; i <= n ; ++ i ) {
int temp = M / a[i] ;
int x , y ;
int gcd = exgcd( temp , a[i] , x , y );
x = (x%a[i]+a[i])%a[i] ;
ans = (ans + temp*x*m[i] ) % M ;
}
}
int main()
{
scanf("%d", &n );
for(int i =1 ; i <= n ; ++ i ) {
scanf("%d%d", &a[i] , &m[i] );
M *= a[i] ;//最小公倍数
}
China();
printf("%d", (ans%M+M) % M );
return 0;
}