UVA756 Biorhythms【模板 中国剩余定理】

本文介绍了一道编程竞赛题目,通过分析题目特点,将其转化为中国剩余定理问题。文章提供了详细的代码实现,包括如何处理大数、求解线性同余方程组以及在限制条件下寻找有效解的方法。

在这里插入图片描述

analysis

如果不考虑limit,那么这就是一道中国剩余定理裸题

但是若考虑的话,那么当求出来的解在limit下的时候,可以对其不断的加23×28×33=2125223\times 28\times33=2125223×28×33=21252,这样的话,这个值一定是解

code

#include<iostream>
#include<cstdio>
using namespace std;
#define loop(i,start,end) for(register int i=start;i<=end;++i)
#define anti_loop(i,start,end) for(register int i=start;i>=end;--i)
#define clean(arry,num) memset(arry,num,sizeof(arry))
#define ll long long
#define isdegit(a) ((a>='0'&&a<='9'))
#define re register 
template<typename T>void read(T &x){
	x=0;char r=getchar();T neg=1;
	while(!isdegit(r)){if(r=='-')neg=-1;r=getchar();}
	while(isdegit(r)){x=(x<<1)+(x<<3)+r-'0';r=getchar();}
	x*=neg;
}

ll exgcd(ll a,ll b,ll &x,ll &y){
	if(b==0){
		x=1;y=0;
		return a;
	}
	ll res=exgcd(b,a%b,x,y);
	ll x1=x,y1=y;
	x=y1;
	y=x1-a/b*y1;
	return res;
}

ll china(ll n,ll *a,ll *m){
	ll M=1;
	loop(j,1,n)
		M*=m[j];
	ll res=0;
	loop(i,1,n){
		ll ti=0,y=0;
		exgcd((M)/m[i],m[i],ti,y);
		ti=(m[i]+ti)%m[i];
		res=(res+a[i]*(M)/m[i]*ti)%M;	
	}
	return res;
}
ll A[10],M[10];
int main(){
	#ifndef ONLINE_JUDGE
	freopen("datain.txt","r",stdin);
	#endif
	int _p=0,_e=0,_i=0,_d=0,cnt=0;
	M[1]=23,M[2]=28,M[3]=33;
	while(scanf("%d%d%d%d",&_p,&_e,&_i,&_d),_p!=-1){
		A[1]=_p;A[2]=_e;A[3]=_i;
		ll res=china(3,A,M);
		printf("Case %d: the next triple peak occurs in %lld days.\n",++cnt,((res>_d)?res-_d:21252-(_d-res)));
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndrewMe8211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值