【poj 1006】Biorhythms 中国剩余定理

本文介绍了中国剩余定理的基本概念及其应用,并通过一个具体的编程示例展示了如何使用该定理来解决特定类型的数学问题。文章包含定理的数学表述、求解步骤以及C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/acdreamers/article/details/8050018

中国剩余定理:

                       x≡a1(mod m1)

                       x≡a2(mod m2)

                       x≡a3(mod m3)

                       x≡a4(mod m4)

                       x≡a5(mod m5)

                        .................

其中m1,m2,m3,m4.......之间互质,那么我们令M=m1*m2*m3*4.......在%M的意义下x有唯一解

X≡(a1*M1*M1-1 +a2*M2*M2-1+.....ai*Mi*Mi-1

Mi-1

是对于的mi逆元



好了,思考这一道题,题目化简成数学公式就是求:(n+d)%23=p        (n+d)%28=i      (n+d)%33=e

求解n,为了方便我们将n+d表示成x再化简就是  : x≡p(mod 23)         x≡i(mod 28)       x≡e(mod 33)

直接套用模板就好了

#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
LL P,E,I,D;
LL m[]={0,23,28,33},M=21252ll,a[5];

void exgcd(LL a,LL b,LL& g,LL& x,LL& y){
	if(b==0){g=a;x=1,y=0;}
	else{
		exgcd(b,a%b,g,y,x);
		y-=x*(a/b);
	}
}
LL CRT(){
	LL ans=0;
	LL x,y,g,mi;
	for(LL i=1;i<=3;i++){
		mi=M/m[i];
		exgcd(mi,m[i],g,x,y);
		ans=(ans+a[i]*mi*x)%M;
	}
	return ans;
}

int main(){
	LL cas=0;
	while(scanf("%lld%lld%lld%lld",&P,&E,&I,&D)&&(P+E+I+D)>=0){
		a[1]=P,a[2]=E,a[3]=I;
		LL ans=CRT();
		while(ans<=D)ans+=M;
		printf("Case %lld: the next triple peak occurs in %lld days.\n",++cas,ans-D);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值