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

    描述

    相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。

    输入

    输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5

    输出

    输出总人数的最小值(或报告无解,即输出Noanswer)。实例,输出:89

    样例输入

    2 1 6

    2 1 3

    样例输出

    41

    No answer

    定理1 如 a 对 n 取余等于 b 对 n 取余,c  对 n 取余等于 d 对 n 取余,则 ac  对 n 取余等于 bd 对 n 取余。

    用同余式叙述就是:

    如  a % n == b % n      c % n == d % n  

    则  ac % n == bd % n

    定理2 被除数 a 加上或减去除数b的倍数,再对 b 取余,余数 r 不变。即

    如a ≡ r(mod b ),则a ± b n≡r(mod b )

    例如70≡1(mod 3 )可得70±10×3≡1(mod 3 ) 

    【韩信点兵法口诀的原理】

    ①能被5,7除尽数是35k,其中k=2,即70除3正好余1,70a 除3正好余 a。

    ②能被3,7除尽数是21k,其中k=1,即21除5正好余1,21b 除5正好余 b。

    ③能被3,5除尽数是15k,其中k=1,即15除7正好余1,15c 除7正好余 c。

    这样——

    根据①可知 70a+21b+15c 除3正好余a。

    根据②可知 70a+21b+15c 除5正好余b。

    根据③可知 70a+21b+15c 除7正好余c。 

    (70a+21b+15c)%(3*5*7)为最小值,然后再判断最小值是否满足条件。

    代码如下

    #include<iostream>
    using namespace std;

    int main()
    {
        int num1,num2,num3;
        int sum;
        while (cin>>num1>>num2>>num3)
        {
            sum = (70*num1 + 21*num2 + 15*num3) % (3*5*7);
            if (sum > 100)
                cout<<"No answer"<<endl;
            else
                cout<<sum<<endl;
        }
        return 0;
    }

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/go-alltheway/p/13338736.html
Copyright © 2011-2022 走看看