zoukankan      html  css  js  c++  java
  • COGS 1786. 韩信点兵

    ★★★   输入文件:HanXin.in   输出文件:HanXin.out   简单对比
    时间限制:1 s   内存限制:256 MB

    【题目描述】

        韩信是中国军事思想“谋战”派代表人物,被后人奉为“兵仙”、“战神”。“王侯将相”韩信一人全任。“国士无双”、“功高无二,略不世出”是楚汉之时人们对其的评价。作为统帅,他率军出陈仓、定三秦、擒魏、破代、灭赵、降燕、伐齐,直至垓下全歼楚军,无一败绩,天下莫敢与之相争。

        相传,韩信带兵打仗时,从不直接清点军队人数。有一次,韩信带1500名兵士打仗,战死四五百人。站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韩信马上说出人数:1049。

        这次,刘邦派韩信带兵N人攻打一座重兵驻扎的城市。城市占领了,可汉军也是伤亡惨重。韩信需要知道汉军至少损失了多少兵力,好向刘邦汇报。

        已知韩信发出了M次命令,对于第i次命令,他选择一个素数Pi,要求士兵每Pi人站一排,此时最后一排剩下了ai人。你的任务是帮助韩信求出这种情况下汉军损失兵力的最小值。当然,由于士兵们都很疲惫,他们有可能站错队伍导致韩信得到的数据有误。

    【输入格式】

    第一行两个正整数N,M,分别代表最初的军队人数和韩信的询问次数。

    接下来有M行,每行两个非负整数Piai,代表韩信选择的素数和此时剩下的人数。

    输入保证每个素数各不相同。

    【输出格式】

    输出一行,一个整数。

    若有解,输出最小损失人数。若无解,输出-1.

    【样例输入】

    1500 3
    3 2
    5 4
    7 6
    
    

    【样例输出】

    31
    
    

    【数据范围】

    30%,1N1,000,000,1M4;

    50%1N100,000,000,1M8;

    100%1N1,000,000,000,000,1M10;1012,0ai<Pi.

    中国剩余定理裸题

    屠龙宝刀点击就送

    #include <ctype.h>
    #include <cstdio>
    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) {printf("-1
    ");return 0;}
        for(;ans+M<=n;ans=ans+M);
        printf("%lld",n-ans);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    English trip V1
    English trip V1
    第一类斯特林数
    bzoj 3601 一个人的数论
    bzoj 4407 于神之怒加强版
    bzoj 2693 jzptab
    bzoj 4184 shallot
    luogu P3920 [WC2014]紫荆花之恋
    bzoj 4269 再见Xor
    luogu P2183 [国家集训队]礼物
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7327706.html
Copyright © 2011-2022 走看看