[Template] Chinese Remainder Theorem (CRT)

Go to: My own blog

topic

Luogu P1495 Chinese Remainder Theorem (CRT)

answer

CRT requires all modulus to be mutually prime.

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=12;
int n;
ll M=1,x,y,ans;
ll a[maxn],m[maxn];
void exgcd(ll a,ll b)
{
	if(!b) {x=1,y=0; return;}
	exgcd(b,a%b);
	ll z=x; x=y; y=z-(a/b)*y;
}
inline ll inv(ll a,ll b) {exgcd(a,b); return (x%b+b)%b;} //求逆元
inline ll CRT()
{
	for(int i=1;i<=n;i++)  M*=m[i];
	for(int i=1;i<=n;i++)
	{
		ll Mi=M/m[i],ti=inv(Mi,m[i]);
		ans=(ans+a[i]*Mi*ti%M)%M;
	}
	return ans;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&m[i],&a[i]);
	printf("%lld\n",CRT());
	
	return 0;
}

Guess you like

Origin blog.csdn.net/zjgmartin/article/details/108389797