中国剩余定理(朴素的)用来解线性同余方程组:
x≡a[1] (mod m[1])
x≡a[2] (mod m[2])
......
x≡a[n] (mod m[n])
定义ms=m[1]*m[2]*......*m[n] ,mm[i]=ms/m[i] ,inv[i]为mm[i]在模m[i]意义下的逆元。
则:x=mm[1]*inv[1]*a[1] + mm[2]*inv[2]*a[2] + ...... + mm[n]*inv[n]*a[n]
这种朴素的CRT只适用于所有的m[i]两两互质。
虽然说是复习,但是之前学的貌似全忘干净了,感觉像重学了一遍。
给一道裸题:洛谷 P1495 曹冲养猪
上代码。
1 #include<cstdio> 2 #define ll long long 3 4 int n; 5 ll ans; 6 ll m[15],a[15],ms=1; 7 8 void exgcd(ll aa,ll bb,ll &x,ll &y) 9 { 10 if(!bb) 11 { 12 x=1,y=0; 13 return; 14 } 15 exgcd(bb,aa%bb,y,x); 16 y-=(aa/bb)*x; 17 } 18 19 int main() 20 { 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++)scanf("%lld%lld",&m[i],&a[i]),ms*=m[i]; 23 for(int i=1;i<=n;i++) 24 { 25 ll mm=ms/m[i]; 26 ll inv,yy; 27 exgcd(mm,m[i],inv,yy); 28 ans=(ans+mm*inv*a[i])%ms; 29 } 30 printf("%lld",(ans%ms+ms)%ms); 31 return 0; 32 }