中国剩余定理(CRT)板子题。
中国剩余定理就是用来求解同余方程组
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪x≡c1(modm1)x≡c2(modm2)x≡c3(modm3)...x≡ck(modmk)
其中满足 (mi,mj)=1,1<=i≠j<=k
x的最小非负数解。
结论:
令
M=m1∗m2∗m3∗...∗mk
则
x=(∑i=1kci∗Mmi∗inv(Mmi,mi))%M
证明:portal
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
#define ld long double
#define inf 0x3f3f3f3f
#define N 15
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline ll read(){
ll x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n,m[N],c[N];ll L,R,M=1,num=0;
inline void exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=1;y=0;return;}
exgcd(b,a%b,x,y);ll t=x;x=y;y=t-a/b*y;
}
int main(){
// freopen("a.in","r",stdin);
n=read();L=read();R=read();
for(int i=1;i<=n;++i){
M*=(m[i]=read());c[i]=read();
}ll ans=0,x,y;
for(int i=1;i<=n;++i){
ll a=M/m[i],b=m[i];exgcd(a,b,x,y);x=(x%b+b)%b;
(ans+=c[i]*a%M*x)%=M;
}if(ans<L) ans+=((L-1-ans)/M+1)*M;
if(ans>R){printf("0\n0\n");return 0;}
num=(R-ans)/M+1;
printf("%lld\n%lld\n",num,ans);
return 0;
}