數論之中國剩餘定理
中國剩餘定理是中國古代求解一次同餘式組(見同餘)的方法,是數論中一個重要定理,又稱孫子定理。
孫子定理
孫子定理主要用來求解模線性不定方程組。
對於方程組:
x0 ≡a0 (mod b0 )
x1 ≡a1 (mod b1 )
x2 ≡a2 (mod b2 )
. . .
xn ≡an (mod bn )
設m=b0
*b1
*b2
*...*bn,
mi
=m/bi
得到方程組
mi xi +bi yi =1
擴歐求解後,原模線性方程組的解為:
∑mi *ai *xi mod m
看程式碼吧:
1 #include <cstdio> 2 using namespace std; 3 const int MAXN=10050; 4 int n; 5 int a[MAXN],b[MAXN]; 6 7 void exgcd(long long a,long long b,long long &x,long long &y) 8 { 9if(a%b==0) 10{ 11x=0;y=1;return ; 12} 13exgcd(b,a%b,x,y); 14long long t=x; 15x=y;y=t-a/b*y; 16 } 17 18 long long China_Reminder(int n) 19 { 20long long m=1,mi,res=0,x,y; 21for(int i=1;i<=n;i++)m*=b[i]; 22for(int i=1;i<=n;i++) 23{ 24mi=m/b[i]; 25exgcd(mi,b[i],x,y); 26x=(x%b[i]+b[i])%b[i]; 27res=(res+mi*a[i]*x%m)%m; 28} 29return (res+m)%m; 30 } 31 32 int main() 33 { 34scanf("%d",&n); 35for(int i=1;i<=n;i++)scanf("%d %d",&a[i],&b[i]); 36printf("%lld\n",China_Reminder(n)); 37return 0; 38 } View Code
例題:fzu1402 豬的安家