今年网络赛用到的知识点,补习中……
题意:人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力p,情感e,智力i 出现峰值的日期。然后再给出一个起始日期d,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。
思路:中国剩余定理。
关于中国剩余定理,这个讲的比较好:
POJ1006: 中国剩余定理的完美演绎 - head for better - 博客园
最重要的是用好:
- 如果 a%b=c , 则有 (a+kb)%b=c (k为非零整数)。
- 如果 a%b=c,那么 (a*k)%b=kc (k为大于零的整数)。
使33×28被23除余1,用33×28×6=5544;
使23×33被28除余1,用23×33×19=14421;
使23×28被33除余1,用23×28×2=1288。
(5544×p+14421×e+1288×i)%(23×28×33)=n+d
n=(5544×p+14421×e+1288×i-d)%(23×28×33)
#include <cstdio>
int main ()
{
int p,e,i,d;
int lcm=21252,Cas=1; // lcm(23,28,33)
while (scanf("%d%d%d%d",&p,&e,&i,&d),~p || ~e || ~i || ~d)
{
int n=(5544*p+14421*e+1288*i-d+lcm)%lcm;
if (n==0) n=lcm;
printf("Case %d: the next triple peak occurs in %d days.\n",Cas++,n);
}
}