中国剩余定理

剩余定理是中国古代求解一次同余式组(同余)的方法,设有一个数除三余二,除五余三.除七余二,问最小是多少

 

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 }

 

posted @ 2018-04-16 20:38  Somnus、M  阅读(277)  评论(0编辑  收藏  举报