中国剩余定理

中国剩余定理模板题

题目来源:P4777 【模板】扩展中国剩余定理(EXCRT)
在这里插入图片描述
在这里插入图片描述
解题思路:
一道中国剩余定理的模板题,需要用到如下知识点
丢番图方程(aX + bY = c)求通解
拓展欧几里得
求逆
带模乘法
同余问题合并

本题思路比较清晰,但用到的数学知识较多,因而难度较大
首先来看拓展欧几里得
用于求解一个特殊X值

ll extend_gcd(ll a,ll b,ll &x,ll &y){
	if(!b){x=1;y=0;return a;}
	ll d=extend_gcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}

看题后给的提示,乘法运算结果有溢出的风险,所以得用带模乘法,写法和快速幂类似,注意循环结束条件是y<=0而不是y==0,否则会re

ll mul(ll x,ll y,ll m){
	ll res=0;
	while(y>0){
		if(y&1) res=(res+x)%m;
		x=(x+x)%m;
		y>>=1;
	}
	return res;
}

然后就要到正题部分了,剩余定理
先来看前两个方程
x=b1+Xa1 x=b2+Ya2
可得b1+Xa1=b2+Ya2
Xa1+(-Ya2)=b2-b1
得到丢番图方程形式a1X + a2Y = c
先用拓展欧几里得求得一个特殊x0
丢番图方程的通解X=X0 c/d +(b/d)n
最小值t=(X0 c/d )mod(b/d)
最后合并得到新的x=b1+t
a1
a=a1*a2/d
b=x
重复此过程直到最后一个方程即可

	ll a1=at[1],b1=bt[1];
	ll ans;
	for(int i=2;i<=n;++i){
		ll x,y;
		ll a2=at[i],b2=bt[i];
		ll c=(b2-b1%a2+a2)%a2;
		ll d=extend_gcd(a1,a2,x,y);
		
		x=mul(x,c/d,a2/d);
		ans=b1+a1*x;
		a1=a2/d*a1;
		ans=(ans%a1+a1)%a1;
		b1=ans;
	}

结果就是ans啦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值