ACM复习(1)1077 韩信点兵

来源:互联网 发布:windos nodejs 80端口 编辑:程序博客网 时间:2024/06/05 16:32

Description
相传汉高祖刘邦问大将军韩信统御兵士多少,韩信答说,每3人一列余1人、5人一列余2人、7人一列余4人、13人一列余6人、 17人一列余2人、19人一列余10人、23人一列余1人、29人一列余11人。

这里写图片描述

刘邦茫然而不知其数。你呢? 你是一位优秀的程序员,请你帮刘邦解决这一问题。

输入格式
要求由键盘输入A,B,C,D,E,F,G,H,a,b,c,d,e,f,g,h十六个数,分别代表每A人一列余a、每B人一列余b、每C人一列余c、每D人一列余D、每E人一列余e、每F人一列余f、每G人一列余g、每H人一列余h,其中A,B,C,D,E,F,G,H为互不相等的质数

输出格式
输出总兵士数,要求输出满足条件的最小的一个,但要满足8种排法的每一种排法至少可排一列。(保证给的数据,有结果且计算的结果不会超过2的63次方)

输入样例
2 3 5 7 11 13 17 19
1 1 1 1 1 1 1 1

输出样例
9699691


解题思路:

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
上面的描述是《孙子算经》里面的一个题目,是不是和本题类似?
以前看过《孙子算经》的这个题目,知道了‘剩余定理’,那么这道题用剩余定理解决就行了

#include<stdio.h>int main(){    long int a[8] , b[8];    long long int n = 1, max = 0, key, flag = 0, total;    for(int i = 0; i<8; i++)    {        scanf("%ld", &a[i]);        max = max > a[i] ? max : a[i];        // 观察后发现《孙子算经》或者题目中出现的除数都是质数,直接相乘即为最小公倍数        n *= a[i];    }    for(int i = 0; i<8; i++)        scanf("%ld", &b[i]);    for(int i = 0; i<8; i++)        for(int j = 1; ;j++)        {            // n除去a[i]可得其他除数的最小公倍数            key = j * n / a[i];            if(key % a[i] == 1)            {                flag += key * b[i];                break;            }        }    total = flag % n;    printf("%lld\n",total < max ? total + n : total);}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 离婚判决生效书丢了怎么办 法院判决离婚对方上诉怎么办 法院判决离婚上诉中级法院怎么办 刑诉中二审发现一审事实错误怎么办 法院判决过了执行期怎么办 刑事犯罪判决后法院未执行怎么办 法院起诉对方不签字怎么办 法院判离婚对方不要签字怎么办 老人不能到法院签字怎么办 法院判决书被告人没签字怎么办? 法院判决离婚一方不签字怎么办 法院判决离婚对方不签字怎么办 法院已判决被告没有钱怎么办 判决还款但是的确没有钱怎么办 强执执行没有钱怎么办 法院判了没钱还怎么办 判决后对方不给钱怎么办 欠钱判决后没钱怎么办 判决了还不给钱怎么办 驾驶证到期本人在监狱服刑怎么办 轻伤过了追诉期怎么办 判决生效书丢了怎么办 高层17楼水压低怎么办 高层六楼水压低怎么办 高层6楼水压低怎么办 高层5楼水压低怎么办 高层五楼水压小怎么办 高层四楼水压低怎么办 高层6楼水压不够怎么办 马桶水箱盖坏了怎么办 马桶水箱盖子坏了怎么办 绿萝的叶子黄了怎么办 绿萝叶子烂了怎么办 还款协议签订后一方反悔怎么办 签了协议想反悔怎么办 体温计打碎了水银找不到了怎么办 模拟城市5核电站爆炸怎么办 日本地铁票丢了怎么办 在日本地铁票丢了怎么办 首付交了没合同怎么办 工程干完不给签合同怎么办