对于(n)个方程组成的方程组组
[left{
egin{aligned}
xequiv A_1 (mod && B_1) \ xequiv A_2 (mod && B_2)\dots \xequiv A_i (mod && B_i)
end{aligned}
ight.
]
设(mul=Pi_{i=1}^{i<=n} B_i),(T_i)为(M_i)在(mod B_i)意义下的逆元,(M_i=frac{mul}{B_i})
则(ans=sum M_i imes T_i imes A_i)
(M_i) 个人认为用来抵消
然后,妙啊
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<map>
#include<queue>
#include<iostream>
#include<cmath>
//#define int long long
using namespace std;
inline int gi(){char tmp=getchar();int flag=1;while(tmp<'0'||tmp>'9'){if(tmp=='-'){flag=-1;tmp=getchar();break;}tmp=getchar();}int ans=0;while(tmp<='9' and tmp>='0') {ans=ans*10+tmp-'0';tmp=getchar();}return ans*flag;}
inline void write(int x){static int stk[100], top = 0;if (x == 0) { putchar('0'); putchar(' ');return; }if (x < 0) { x = -x; putchar('-'); }while (x) { stk[++top] = x % 10; x /= 10; }while (top) { putchar(stk[top--] + '0'); }putchar(' ');}
#define line() putchar('
');
#define Mem(Arr,V) memset(Arr,V,sizeof Arr);
#define Mcpy(Arr,qwq) memcpy(Arr,qwq,sizeof qwq);
#define max3(a,b,c) max(max(a,b),c)
#define max4(a,b,c,d) max4(max3(a,b,c),d);
#define in(a) a=gi()
#define in2(a,b) in(a),in(b)
#define in3(a,b,c) in2(a,b),in(c)
#define in4(a,b,c,d) in3(a,b,c),in(d)
#define write2(a,b) write(a),write(b)
#define write3(a,b,c) write2(a,b),write(c)
#define write4(a,b,c,d) write3(a,b,c),write(d)
#define smin(a,b) a=min(a,b)
#define smax(a,b) a=max(a,b)
void Exgcd(int a,int b,int &x,int &y)
{
if(!b) {x=1,y=0;return;}
Exgcd(b,a%b,y,x);y-=x*(a/b);
}
inline int Inv(int x,int mod)
/*
x*inv=1(%mod)
x*inv+mod*y=1
*/
{
int inv,y;
Exgcd(x,mod,inv,y);
return inv;
}
#define N 100001
int A[N],B[N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("data.in","r",stdin);
#endif
int n;
in(n);
int mul=1;
for(int i=1;i<=n;++i)
{
in2(B[i],A[i]);
mul*=B[i];
}
int ans=0;
for(int i=1;i<=n;++i)
{
int m=mul/B[i];
ans=((ans+m*Inv(m,B[i])*A[i]%mul)+mul)%mul;
ans%=mul;
}
write(ans);
return 0;
}