Luogu 1495(中国剩余定理)(模板)

传送门

题意:给定数组m[N]和r[N],求一个最小的正整数x满足x%m[i]=r[i](已知对于任意i, j保证mi, mj互质)

题解:模数互质的中国剩余定理模板题,下面的图文引用自该博客

设正整数两两互素,则同余方程组

                             

有整数解。并且在模下的解是唯一的,解为

                               

其中,而的逆元。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+4;
int n;
ll mod[N],res[N];
inline ll exgcd(ll a,ll b,ll &x,ll &y) {
	if (!b) {
		x=1,y=0;
		return a;
	}
	ll x1,y1,d=exgcd(b,a%b,x1,y1);
	x=y1,y=x1-(a/b)*y1;
	return d;
}
inline ll inv(ll a,ll b) {
	ll x,y,d=exgcd(a,b,x,y);
	if (d^1) return -1;
	return (x%b+b)%b;
}
inline ll crt(ll *m,ll *r) {
	ll M=1,ret=0;
	for (register int i=1;i<=n;++i) M*=m[i];
	for (register int i=1;i<=n;++i) {
		ll Mi=M/m[i];
		ll t=inv(Mi,m[i]);
		(ret+=r[i]*Mi%M*t%M)%=M;
	}
	return ret;
}
int main() {
	scanf("%d",&n);
	for (register int i=1;i<=n;++i) scanf("%d%d",&mod[i],&res[i]);
	printf("%lld\n",crt(mod,res));
	return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值