HDU 1370 Biorhythms (中国剩余定理, 简单套用)

题意:有3个循环周期,周期天数分别为23、28、33。对于某一年,已知某年这3个周期的某一峰值分别是当年的第p、e、i天, 问从第d天开始到最近一个满足3个周期都达到峰值的日期还有多少天。


经典的中国剩余定理应用题目.

#include<bits/stdc++.h>
#define rep(i,a, b) for(int i=(a); i<(b); ++i)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define ll long long
#define de(a) cout<<#a<<" => " <<(a)<<endl
const int maxn = 1e6+5;

using namespace std;
void extend_Euclid(int a, int b, int &x, int &y){
	if(b==0) {
		x=1, y=0;
		return ;
	}
	extend_Euclid(b, a%b, x, y);
	int tmp = x;
	x = y;
	y = tmp-(a/b)*y;
	return;
}
int CRT(int a[], int m[], int n){
	int M=1;
	int ans=0;
	rep(i, 1, n+1) M*=m[i];
	rep(i, 1, n+1){
		int x, y;
		int MI = M/m[i];
		extend_Euclid(MI, m[i], x, y);
		ans = (ans+MI*x*a[i]+M)%M;
	}
	return (ans+M)%M;
}
int a[10], m[10]={0, 23, 28, 33};
int main(){
	//freopen("in.txt", "r", stdin);
	int T;
	scanf("%d", &T);
	while(T--){
		int d, cas=0;
		while(~scanf("%d %d %d %d", &a[1], &a[2], &a[3], &d)){
			if(a[1]==-1 && a[2]==-1 && a[3]==-1 && d==-1) break;
			int ans= CRT(a, m, 3);
			if(ans <= d) ans+=23*28*33;
			printf("Case %d: the next triple peak occurs in %d days.\n", ++cas,ans-d); 	
		}
	}
	return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值