中国剩余定理
剩余定理是中国古代求解一次同余式组(同余)的方法,设有一个数除三余二,除五余三.除七余二,问最小是多少
1.求出最小公倍数3*5*7=105
2.105÷5=21
21÷5=4......1
定理2把1扩大3倍得到3,那么被除数也扩大3倍,得到21*3=63//基础数63
3.105÷7=15
15÷7=2......1
定理2把1扩大2倍得到2,那么被除数也扩大2倍,得到15*2=30//基础数30
把得到的基础数加和(注意:基础数不一定就是正数)
35+63+30=128
4、减去最小公倍数(在比最小公倍数大的情况下)
x=128-105=23
那么满足题意得最小的数就是23了。
代码模板
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int exgcd(int a,int b,int &x,int &y) 6 { 7 int d; 8 if(b==0) 9 { 10 x=1;y=0; 11 return a; 12 } 13 d=exgcd(b,a%b,y,x); 14 y-=(a/b)*x; 15 return d; 16 }//扩展欧几里得算法求解逆元 17 18 int china(int r[],int p[],int len)//r为余数,p为任意数x 19 { 20 int M=1,m,x,y,sum=0; 21 for(int i=0;i<len;i++) M*=p[i]; 22 for(int i=0;i<len;i++) 23 { 24 m=M/p[i];//除去自身的除数 25 exgcd(p[i],m,x,y);//乘法逆元计算w[i]*x+m*y=gcd(w[i],m)的一个解y 26 sum=(y*m*r[i]+sum)%M;//累加整数解y并不断对M取余,m相当于基础数,r为余数,m若扩展欧几里得ab互素,则为1 27 } 28 29 return (M+sum%M)%M;//使得求出的书最小 30 }