题目:
题解:
裸题?下面讲解见咯
代码:
#include <cmath>
#include <cstdio>
#define LL long long
using namespace std;
int m[12],c[12];
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()
{
LL M=1,ans=0,a,b;
int n,i;
scanf("%d%lld%lld",&n,&a,&b);
for (i=1;i<=n;i++)
{
scanf("%d%d",&m[i],&c[i]);
M=M*(LL)m[i];
}
for (i=1;i<=n;i++)
{
LL x,y;
exgcd(M/m[i],m[i],x,y);
x=(x%m[i]+m[i])%m[i];
if (!x) x+=m[i];
LL ni=M/m[i]*x;
ans+=(LL)c[i]*ni;
}
ans%=M;if (!ans) ans+=M;
if (ans>b || (ans<a && (ceil((double)(a-ans)/(double)M)>floor((double)(b-ans)/(double)M)) ) ) printf("0\n0");
else
{
if (ans<a)
{
int x=(int)ceil((double)(a-ans)/(double)M);
ans+=x*M;
}
printf("%lld\n",(b-ans)/M+1);
printf("%lld",ans);
}
}
普及向:
又是新姿势啦但我以前好像写过?,中国剩余定理(CRT),写的极好的blog from优秀的学姐
截图
每隔M就有一个解