poj 1006 Biorhythms(中国剩余定理)

题目大意:
人有三个生理周期,给出三个周期的初始日期,请求出多少天后三个生理周期同时出现。
体力周期–23天
感情周期–28天
智力周期–33天
首先解释中国剩余定理这个神奇的东西 >o<
先来一个典型例题—-伟大的韩信点兵创造了这道题目 >o<
韩信点兵,三三余二,五五余三,七七余二。
设共有n个人(n为符合条件的最小数)
n%3=2;
n%5=3;
n%7=2;
首先求满足n%3=2的数
设a%3=1
于是a=4
易证a*2%3=2,so a*2=x;
所以
3*5*x%7=1
a=3*5*x
5*7*y%3=1
3*7*z%5=1
b c同上
so n=(a*7+b*3+c*5)%lcm(3,7,5)
此题同理
求(n+d)%23=p;
(n+d)%28=e;
(n+d)%33=i;
求n

#include<iostream>// 中国剩余定理
#include<cstdio> 
using namespace std;//p--体力周期23;e--感情周期28;i--智力周期33int main(){
    int p,e,i,d,cnt=0;
    //23*28*2=1288
    //23*33*19=14421
    //28*33*6=5544
    while(scanf("%d%d%d%d",&p,&e,&i,&d)){
        if(p==-1&&e==-1&&i==-1&&d==-1)
            break;
        cnt++;
        int ans;
        ans=((1288*i+14421*e+5544*p)+21252-d)%(23*28*33);//因为可能出现负数,所以要加上21252
        if(ans==0)
            ans=21252;
        cout<<"Case "<<cnt<<": the next triple peak occurs in "<<ans<<" days."<<endl;
    }
    return 0;
}

你可能感兴趣的:(poj)