POJ 1006 Biorhythms | 中国剩余定理

题目:

人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。

通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。

然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。

 


 

题解:中国剩余定理.参考了这篇博文.

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 int p,e,i,d,t=1,cnt,a[5],m[5];
 6 int exgcd(int a,int b,int &x,int &y)
 7 {
 8     if (b==0) return x=1,y=0,a;
 9     int r=exgcd(b,a%b,y,x);
10     y-=(a/b)*x;
11     return r;
12 }
13 int CRT(int a[],int m[],int n)
14 {
15     int M=1;
16     int ans=0;
17     for (int i=1;i<=n;i++)
18     M*=m[i];
19     for (int i=1;i<=n;i++)
20     {
21     int x,y;
22     int Mi=M/m[i];
23     exgcd(Mi,m[i],x,y);
24     ans=(ans+Mi*x*a[i])%M;
25     }
26     if (ans<0) ans+=M;
27     return ans;
28 }
29 int main()
30 {
31     while (scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF)
32     {
33     if (p==-1 && e==-1 && i==-1 && d==-1)
34         break;
35     a[1]=p;
36     a[2]=e;
37     a[3]=i;
38     m[1]=23;
39     m[2]=28;
40     m[3]=33;
41     int ans=CRT(a,m,3);
42     if (ans<=d)
43         ans+=21252;
44     printf("Case %d: the next triple peak occurs in %d days.\n",++cnt,ans-d);
45     }
46     return 0;
47 }

 

posted @ 2017-11-27 20:03  MSPqwq  阅读(126)  评论(0编辑  收藏  举报