【51nod 1079】中国剩余定理(模板)

【题目】

传送门

题目描述:

一个正整数 kkk,给出 kkk 对一些质数取模的结果,求符合条件的最小的 kkk。

例如,k%2=1k \% 2 = 1k%2=1,k%3=2k \% 3 = 2k%3=2,k%5=3k \% 5 = 3k%5=3。符合条件的最小的 k=23k = 23k=23。

输入格式:

111 行:111 个数 nnn 表示后面输入的质数及模的数量。(2n102 \le n \le 102≤n≤10)

222 ~ n+1n + 1n+1行,每行 222 个数 ppp 和 mmm,中间用空格分隔,ppp 是质数,mmm 是 k%pk \% pk%p 的结果。(2p100,0k&lt;p)(2 \le p \le 100, 0 \le k &lt; p)(2≤p≤100,0≤k<p)

输出格式:

输出符合条件的最小的 kkk。数据中所有 kkk 均小于 10910^9109。

样例数据:

输入
3
2 1
3 2
5 3

输出
23


【分析】

如题,这是一道 CRT 的模板题。

具体的做法就看我的这篇博客中国剩余定理


【代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll a[15],m[15],M[15];
void exgcd(ll a,ll b,ll &x,ll &y)
{
	if(!b)  {x=1,y=0;return;}
	exgcd(b,a%b,y,x),y-=a/b*x;
}
int main()
{
	int n,i;
	scanf("%d",&n);
	ll x,y,ans=0,num=1;
	for(i=1;i<=n;++i)
	  scanf("%lld%lld",&m[i],&a[i]),num*=m[i];
	for(i=1;i<=n;++i)
	{
		M[i]=num/m[i];
		exgcd(M[i],m[i],x,y);
		x=(x+m[i])%m[i];
		ans+=a[i]*M[i]*x;
	}
	printf("%lld",ans%num);
	return 0;
}
上一篇:51nod——1672 区间交 (树状数组解决区间交问题)


下一篇:51Nod 1593 公园晨跑(RMQ,ST表)