今天刷思维题时 刷到一个很有意思的题,就是 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; }