中国剩余定理的起源 "韩信点兵问题"
有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何
可写成数学表达形式求x 注下面的= 都是恒等号(因为我打不出来这个恒等号的符号FUCK)
x=2( mod 3 )
x=3( mod 3)
x=2( mod 7)
抽象一下 中国剩余定理可以用来解决如下问题
x=b1 ( mod m1)
x=b2 ( mod m2)
x=b3 ( mod m3)
.......
x=bn ( mod mn)
mi>0,诸m1..mn 两两互素 求解x 的值
求解过程: 记 m=m1*m2....mn, Mi=m/mi;
那么方程的解就是 x0=(b1M1y1+b2M2y2+...bnMnyn)mod n
其中 yi是 Miyi=1(mod mi)的解
long long extend_gcd(long long a, long long b, long long &x, long long &y){ //这个就是拓展欧几里得的模板
long long t,m;
if ((b==0)&&(a==0)) return -1; //无最大公因数
if (b==0){
x=1;
y=0;
return a;
}
else {
m=extend_gcd(b, a%b, x, y);
t=x; x=y; y=t-(a/b)*y;
}
return m;
}
long long ChinaRemainer(int m0[],int b[],int n) //ppt 上的模板少了 一个 n 根据这个模板 m0[] 和b[] 都是从一开始的
{
long long d,x,y,m=1,a=0;
// long long extend;
int i;
for(i=1;i<=n;i++)
m=m*m0[i];
for(i=1;i<=n;i++)
{
long long MM=m/m0[i];
extend_gcd(MM,m0[i],x,y); //注意 这里并不返回值 不晓得不晓得
a=(a+MM*x*b[i])%m;
}
return a;//返回的是结果
}
本题代码d
题目大意 以及思路请参考 http://blog.csdn.net/discreeter/article/details/70299206
本题注意点 在输出上 x是 第多少天三个峰值重合的时候 如果说x<=D的话 x+=23*28*33
#include<iostream>//http://blog.csdn.net/discreeter/article/details/70299206 模板网站
using namespace std;
long long extend_gcd(long long a, long long b, long long &x, long long &y){ //这个就是拓展欧几里得的模板
long long t,m;
if ((b==0)&&(a==0)) return -1; //无最大公因数
if (b==0){
x=1;
y=0;
return a;
}
else {
m=extend_gcd(b, a%b, x, y);
t=x; x=y; y=t-(a/b)*y;
}
return m;
}
long long ChinaRemainer(int m0[],int b[],int n) //ppt 上的模板少了 一个 n 根据这个模板 m0[] 和b[] 都是从一开始的
{
long long d,x,y,m=1,a=0;
// long long extend;
int i;
for(i=1;i<=n;i++)
m=m*m0[i];
for(i=1;i<=n;i++)
{
long long MM=m/m0[i];
extend_gcd(MM,m0[i],x,y); //注意 这里并不返回值 不晓得不晓得
a=(a+MM*x*b[i])%m;
}
return a;//返回的是结果
}
using namespace std;
int main()
{
int N;
int m0[4]={0,23,28,33};
int b[4];
int d;
int cases=1;
long long x;//达到三顶峰的天数
cin>>N;
while(N--)
{
while(1)
{ cin>>b[1]>>b[2]>>b[3]>>d;
if(b[1]==-1&&b[2]==-1&&b[3]==-1&&d==-1)
break;
x=ChinaRemainer(m0,b,3);
if(x<=d)
x+=23*28*33;
cout<<"Case "<<cases++<<": the next triple peak occurs in "<<x-d<<" days."<<endl;
}
}
return 0;
}
“韩信点兵”问题 :
有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何?
可
“韩信点兵”问题 :
有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何?
可写成数学表示形式,求x
“韩信点兵”问题 :
有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何?
可写成数学表示形式,求x
“韩信点兵”问题 :
有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何?
可写成数学表示形式,求x
“韩信点兵”问题 :
有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何?
可写成数学表示形式,求x