您的位置:首页 > 其它

poj1006 Biorhythms 中国剩余定理

2013-06-13 21:08 411 查看
参考:/article/1968939.html

有中文翻译.

思路:中国剩余定理.

中国剩余定理:

在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。

求解思路:

求出除3余1的a3, 且满足a3 / 5 == 0 && a3 / 7 == 0.很显然满足条件的a3 可以是: a3 = 5 * 3 * k, 求出 k 即可.

然后依次求得满足除5余1的a5, 除7余1的a7.

之前都是余1, 而三三数之剩二, 所以a3还需要乘以2, 即 a3 = a3 * 2, 同理, a5 *= 3, a7 *= 2.

那么a = a3+ a5 + a7 即是一个满足"孙子问题"的一个解.

但在这里我们要求得是最小解我们因此还需要除3, 5, 7的最小公倍数. 即 a %= lcm(3, 5, 7) .

本题思路:

体力p、感情e 和智力i 周期,它们的周期长度为23天、28天和33天,那么lcm(23, 28, 33) = 21252.

p23 = 5544, e28 = 14421,i33 = 1288.

a = (p23*p + e28*e + i33*i - d + 21252) % 21252

#include <iostream>
using namespace std;
/*
a, b 的最大公约数
*/
int lcm(int a, int b)
{
int s = a * b;
int t;
while (b)
{
t = a % b;
a = b;
b = t;
}
return s / a;
}

/*
求得sum,
a | sum && b | sum && sum % r == 1
*/
int China(int a, int b, int r)
{
int t = lcm(a, b);
int sum = t;
while (sum % r!= 1)
{
sum += t;
}
return sum;
}

int main()
{

int p, e, i, d;
//cout<<lcm(lcm(23, 28), 33)<<endl;
int lcm = 21252;
//cout<<China(23, 28, 33)<<endl;
int i33 = 1288;
//cout<<China(28, 33, 23)<<endl;
int p23 = 5544;
//cout<<China(33,23,28)<<endl;
int e28 = 14421;
int t;
int cnt = 0;
while (cin>>p>>e>>i>>d)
{
if (p == -1 && e == -1 && i == -1 && d == -1)
break;
t = (p*p23 + e * e28 + i * i33 - d + lcm) % lcm;
t = t == 0 ? lcm : t;
cout<<"Case "<<++cnt<<": the next triple peak occurs in "<<t<<" days."<<endl;

}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: