中国剩余定理(CRT)
中国剩余定理 (即 Chinese Remainder Theorem,简称 CRT) 可求解如下形式的一元线性同余方程组(其中 \(\gcd(m_1,m_2,\dots,m_n) = 1\)):
\[\begin{cases}
x \equiv a_1 \pmod{m_1}\\
x \equiv a_2 \pmod{m_2}\\
\cdots\\
x \equiv a_n \pmod{m_n}
\end{cases}
\]
解法如下:记 \(M=\prod\limits_{i=1}^n m_i,r_i = \dfrac{M}{m_i},r'_i = (r_i)^{-1}\pmod{n_i}\),则一个答案为 \(ans = \sum\limits_{i=1}^n{a_i r_i r'_i}\),最小正整数解即 \(ans\bmod M\)。
证明显然:对于 \(i\),所有 \(j\neq i\) 都满足 \(r_j\) 为 \(m_i\) 的倍数,故 \(a_j r_j r'_j \equiv 0\pmod{m_i}\);对于 \(i\) 本身满足 \(r_i r'_i \equiv 1\pmod{m_i}\),故 \(a_i r_i r'_i \equiv a_i\pmod{m_i}\)。所以有 \(\sum\limits_{i=1}^n{a_i r_i r'_i} \equiv a_i \pmod{m_i}\)。
P1495 模板代码
#include<iostream>
#include<cstdio>
#define ll long long
#define maxn 15
using namespace std;
int n,a[maxn],b[maxn]; ll prod=1LL,ans=0,x,y;
void exgcd(ll aa,ll bb,ll &x,ll &y){if(bb==0){x=1LL; y=0LL; return;} exgcd(bb,aa%bb,x,y); ll tmp=x; x=y; y=tmp-(aa/bb)*y;}
int main(){
scanf("%d",&n); for(int i=1;i<=n;i++){scanf("%d%d",&a[i],&b[i]); prod*=1LL*a[i];}
for(int i=1;i<=n;i++){ll res=prod/a[i]; exgcd(res,a[i],x,y); x=(x%a[i]+a[i])%a[i]; ans+=b[i]*res*x;}
printf("%lld",ans%prod);
return 0;
}