【NYoj】34 - 韩信点兵(CRT)

来源:互联网 发布:涩谷 涉谷 知乎 编辑:程序博客网 时间:2024/05/17 04:19

点击打开题目

韩信点兵

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
描述
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入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
输出
输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89
样例输入
2 1 6
样例输出
41
来源
经典算法
上传者
首席执行官



记得学C语言的第一天我用for循环,边写边查bug写了半天最后解出来,那个兴奋啊!

还有两个多月就一年了,一年的时间把我从以前的小白变成了现在的小灰?what?你说小白的小灰是什么区别,好吧,话不多说,看图就知道了:




好了写代码之余偶尔抒发下感觉也是可以原谅的对吧。下面说正题:


这个题只是用中国剩余定理(CRT)小试牛刀而已,证明自己的理解还是挺清楚的,没有看之前打的模板自己按理解打下来了。


代码如下:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define CLR(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3fint GCD(int a,int b){return b == 0 ? a : GCD(b,a%b);}void exGCD(int a,int b,int &x,int &y){if (b == 0){x = 1;y = 0;return;}exGCD(b,a%b,y,x);y -= a / b * x;}int CRT(int *m,int *a,int n)//m表示除数,a为余数 {int M = 1;for (int i = 1 ; i <= n ; i++)M = M / GCD(M , m[i]) * m[i];//这里求最小公倍数int ans = 0;int x,y;for (int i = 1 ; i <= n ; i++){int Mi = M / m[i];exGCD(m[i],Mi,x,y);//求 Mi 模 m[i] 的逆元(即公式的 M^(-1)) ans = (ans + a[i] * Mi * y) % M;}return ans;}int main(){int m[4] = {0,3,5,7};int a[4];scanf ("%d %d %d",&a[1],&a[2],&a[3]);int ans = CRT(m,a,3);printf ("%d\n",ans);return 0;}


0 0
原创粉丝点击