孙子算经
今有物不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?
这个题实际是求解一下同余方程
x=2(mod 3);
x=3(mod 5);
x=2(mod 7);
先解下面三个同余方程:
x=0(mod 5);
x=1(mod 3); 70
x=0(mod 7);
x=0(mod 3);
x=1(mod 5); 21
x=0(mod 7);
x=0(mod 3);
x=0(mod 5); 15
x=1(mod 7);
70,21,15分别为同余方程的解;
原同余方程的解为2*70+21*3+15*2mod(105)=23;
设素数m1,m2,m3......,mi
N=m1*m2*m3*...*mi;
另 x=(N/mi)*y;
(N/mi)*y=1(mod mi);
因为mi和N/mi互素
(N/mi)*y+mi*x=1可以用扩展欧几里得算法求出特解yi,xi=(N/mi)*y;
x0=b1*x1+b2*x2+...+bi*xi;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ret=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
return ret;
}
int China(int w[],int B[],int k)
{
int x,y,a=0,m,n=1;
for(int i=0;i<k;i++)
n*=w[i];
for(int i=0;i<k;i++)
{
m=n/w[i];
exgcd(w[i],m,x,y);
a+=(m*y*B[i])%n;
}
if(a>0) return a;
else
return a+n;
}