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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值