中国剩余定理(孙子定理)HDU数论二1003模板题

中国剩余定理的起源  "韩信点兵问题"

  有兵一列,三三数之余二,五五数之余三,七七数之余二,问兵几何

可写成数学表达形式求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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值