比赛 hhh 评测结果 AAAAAAAAAA
题目名称 韩信点兵 最终得分 100
用户昵称 雾茗 运行时间 0.001 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2018-07-31 10:04:31
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
void read(LL &x)
{
    x=0;bool f=0;
    register char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
    for(; isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    x=f?(~x)+1:x;
}
LL n,m,p[15],a[15],M=1;
void exgcd(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
}
LL CRT()
{
    LL ans=0;
    for(int i=1;i<=m;i++)
    {
        LL Mi=M/p[i],x,y;
        exgcd(Mi,p[i],x,y);
        ans=(ans+x*a[i]*Mi)%M;
    }
    if(ans<0) ans+=M;
    return ans;
}
int main()
{
    freopen("HanXin.in","r",stdin);
    freopen("HanXin.out","w",stdout);
    read(n);
    read(m);
    for(int i=1;i<=m;i++)
    {
        read(p[i]);
        read(a[i]);
        M*=p[i];
    }
    LL ans=CRT();
    if(ans>n) {cout<<-1;return 0;}
    for(;ans+M<=n;ans=ans+M);
    cout<<n-ans;
    return 0;
}