题目描述
题解
中国剩余定理模板题
在模[m1,m2,…,mk]意义下有唯一解,也就是说每+[m1,m2…,mk]都有一组解
最后统计答案的时候讨论一下lr和n的大小就可以了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long
LL k,l,r,n,M,x,y,Min,ans,m[15],c[15];
void exgcd(LL a,LL b,LL &x,LL &y)
{
if (!b) x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
int main()
{
scanf("%d%lld%lld",&k,&l,&r);
M=1LL;
for (int i=1;i<=k;++i)
{
scanf("%lld%lld",&m[i],&c[i]);
M*=m[i];
}
for (int i=1;i<=k;++i)
{
LL a=M/m[i],b=m[i];
exgcd(a,b,x,y);
x=(x%b+b)%b;
if (!x) x+=b;
n+=c[i]*a*x;
}
n%=M;
if (!n) n+=M;
if (r>=n)
ans=(r-n)/M+1;
if (l>=n) ans=ans-((l-n)/M+1);
if ((l-n)%M==0) ++ans;
if (ans)
{
if (l<=n) Min=n;
else Min=n+((l-n)/M+1)*M;
}
printf("%lld\n%lld\n",ans,Min);
}