【模板】中国剩余定理(CRT)

前往:我自己搭建的博客

题目

洛谷P1495中国剩余定理(CRT)

题解

CRT要求所有模数两两互质。

代码

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

猜你喜欢

转载自blog.csdn.net/zjgmartin/article/details/108389797