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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章