hdu1370中国剩余定理crt通用模板(运用到exgcd)

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1e5+5;
const int mod=21252;
int m[4]={0,23,28,33},a[4],n=3;
int exgcd(int a,int b,int &x,int &y){
	if(!b){ x=1;y=0;return a;	}
	int d=exgcd(b,a%b,x,y);
	int t=x;
	x=y;y=t-a/b*y;
	return d;
} 
//m数组存mod,a数组存余数 
int crt(){
	int M=m[1],tx=a[1],x,y;
	for(int i=2;i<=n;i++){
		int c=a[i]-tx;
		//为了下面求t 。tx为前i-1的解  
		int d=exgcd(M,m[i],x,y);
		if(c%d) return -1;
		// 若ab的最大公因数不是 c的因子,则x无解 。a*x ≡c(%b)  
		m[i]=m[i]/d;c=c/d;
		int t=(x*c%m[i]+m[i])%m[i];
		//t为互质的情况下求出的x ,对m[i]的各种操作保证了最小非负整数解 
		int lcm=M*m[i]; 
		//lcm为 m的前i个数的最小公倍数 ,M为前i-1个
		tx=(tx+t*M%lcm)%lcm;
		M=lcm;
	}
	return tx;
} 
int main(){
	int id=0,d,t;
	cin>>t;//这里输出 有点怪 t, 没事不用管 
	while(t--){
		id=0;
		getchar();
		while(cin>>a[1]>>a[2]>>a[3]>>d){
			if((a[1]+a[2]+a[3]+d)<0) break;
			int ans=(crt()-d+mod)%mod;
			if(!ans) ans=mod;
			printf("Case %d: the next triple peak occurs in %d days.\n",++id,ans);
		}
		if(t) puts("");
	}
	
	return 0;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值