题目描述
传送门
题解
中国剩余定理
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 20
#define LL long long
using namespace std;
LL n,m,a[N],p[N],mod;
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=y;
y=x-(a/b)*y;
x=t;
}
LL china()
{
LL ans=0;
for (int i=1;i<=m;i++) {
LL mi=mod/p[i];
LL x,y;
exgcd(mi,p[i],x,y);
ans=(ans+mi*x*a[i])%mod;
}
return (ans%mod+mod)%mod;
}
int main()
{
freopen("HanXin.in","r",stdin);
freopen("HanXin.out","w",stdout);
scanf("%lld%lld",&n,&m); mod=1;
for (int i=1;i<=m;i++) scanf("%lld%lld",&p[i],&a[i]),mod*=p[i];
LL ans=china();// cout<<ans<<endl;
if (ans>n) {
printf("-1\n");
return 0;
}
LL t=(n-ans)/mod*mod;
ans=n-ans-t;
printf("%lld\n",(ans%mod+mod)%mod);
}