中国剩余定理的简单应用 poj 1006 Biorhythms

今天刷思维题时 刷到一个很有意思的题,就是 poj 1006  Biorhythms  点击打开链接

题意是:每个人都有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,现给出每个周期峰值的日期a b c,和一个起始日期 d ,求 多少天后,三个生理期都达到峰值。将之转化为数学表达式就是:

令 u=23,v=28,w=33。

(n+d)%u=a,(n+d)%v=b,(n+d)%w=c.运用中国剩余定理的话就是

令(u*v*k1)%w=1,(u*w*k2)%v=1,(v*w*k3)%u=1,

解出k1,k2,k3,

则(n+d)=(u*v*k1*r1+u*w*k2*r2+v*w*k3*r3)%lcm(u,v,w)。

其中 lcm(a,b,c)为a b c的最小公倍数。具体证明的话需要一定数学基础,还要求逆元,有兴趣的朋友可以去网上查阅相关资料。

知道了这个之后,这题就简单多了 直接套用公式就好了。

#include<iostream>
using namespace std;

int main(void)
{
    int a,b,c,d;
    int time=1;
    while(cin>>a>>b>>c>>d)
    {
        if(a==-1 && b==-1 && c==-1 && d==-1)
            break;

        int lcm=21252;
        int n=(5544*a+14421*b+1288*c-d+21252)%21252;
        if(n==0)
            n=21252;
        cout<<"Case "<<time++<<": the next triple peak occurs in "<<n<<" days."<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41874469/article/details/79851841