您的位置:首页 > 其它

POJ 1006 Biorhythms (中国剩余定理)

2013-01-06 00:52 351 查看
题目链接:http://poj.org/problem?id=1006

题目大意:poj有译文~抽象成数学模型就是求解同余方程组:

x = p (mod 23)

x = e (mod 28)

x = i (mod 33)

(中国剩余定理)设m1,m2,……,mr是两两互素的正整数.则同于方程组

x = a1 (mod m1)

x = a2 (mod m2)

……

x = ar (mod mr)

有模M = m1*m2*……*mr的唯一解.

并且给出了求解的过程:

令Mk = M / mk = m1 m2……mk-1 mk+1……mr ,因为 j != k 时(mj, mk) = 1, 所以可知(Mk, mk) = 1. 并且我们可以求得Mk模mk的一个逆yk,所以Mk yk = 1 (mod mk). 现在构造和x = a1M1y1 + a2M2y2 + …… + arMryr. 此x就是r个同余方程的联立解.并且可以证明联立解模M唯一的(中国剩余定理的详细证明在《初等数论及其应用》P117).

#include
using namespace std;
int mo(int a, int b, int c){
int num = a * b;
int k = num;
while(1){
if (k % c == 1){
return k;
}
k += num;
}
}
int main() {
int p, e, i, d, day;
int ca = 0;
while(cin >> p >> e >> i >> d) {
if (p == -1 && e == -1 && i == -1 && d == -1){
return 0;
}
p %= 23;
e %= 28;
i %= 33;
int day = (mo(23, 28, 33) * i + mo(23, 33, 28) * e + mo(28, 33, 23) * p) % 21252 - d;
if (day <= 0){
day += 21252;
}
cout << "Case " << ++ca << ": the next triple peak occurs in " << day << " days.\n";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: