您的位置:首页 > 其它

生理周期[PKU1006]

2016-12-16 14:01 309 查看
生理周期

TimeLimit:1000MSMemoryLimit:10000K
TotalSubmissions:132195Accepted:42171
Description

人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。
Input

输入四个整数:p,e,i和d。p,e,i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d是给定的时间,可能小于p,e,或i。所有给定时间是非负的并且小于365,所求的时间小于21252。

当p=e=i=d=-1时,输入数据结束。
Output

从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。

采用以下格式:
Case1:thenexttriplepeakoccursin1234days.

注意:即使结果是1天,也使用复数形式“days”。
SampleInput

0000
000100
52034325
4567
28310223320
20330120340
-1-1-1-1

SampleOutput

Case1:thenexttriplepeakoccursin21252days.
Case2:thenexttriplepeakoccursin21152days.
Case3:thenexttriplepeakoccursin19575days.
Case4:thenexttriplepeakoccursin16994days.
Case5:thenexttriplepeakoccursin8910days.
Case6:thenexttriplepeakoccursin10789days.

可以很简单,直接数50000个就行。也可以更一般的用线性同余方程组。


#include<stdio.h>
#include<algorithm>
#include<math.h>
usingnamespacestd;
classCongruent_Linear_Equation_Group{
private:
#defineMAX_GROUP_SIZE10
intgroupSize,dis;
intA[MAX_GROUP_SIZE],M[MAX_GROUP_SIZE];
intgcd(inta,intb){
intk;
while(b!=0){
k=b;
b=a%b;
a=k;
}
returna;
}
/**********
*a,b=>x,y*
*ax+by=gcd(a,b)*
**********/
intextended_gcd(inta,intb,int&x,int&y){
intans,t;
if(b==0){
x=1;
y=0;
returna;
}else{
ans=extended_gcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*y;
}
returnans;
}
public:
Congruent_Linear_Equation_Group(){
groupSize=0;
}
voidclear(){
groupSize=0;
}
voidaddEquation(inta,intm){
if(m==0){
return;
}
A[groupSize]=a;
M[groupSize++]=m;
}
intgetSolution(){
intat=A[0],mt=M[0],ap,mp,x,y,z;
for(inti=1;i<groupSize;i++){
ap=A[i];
mp=M[i];
if((at-ap)%gcd(mt,mp)!=0){
return-1;
}
/*************
*x=mt*y+at*
*x=mp*z+ap*
*=>at-ap=mp*z-mt*y*
*************/
extended_gcd(mp,-1*mt,z,y);
//=>mp*z-mt*y=gcd(mp,-mt)
z=z*(at-ap)/gcd(mp,-mt);
x=mp*z+ap;
mt=mt*mp/gcd(mt,mp);
while(x<=0){
x+=mt;
}
at=x;
}
dis=mt;
returnx;
}
intgetNextSolution(intx){
returnx+dis;
}
};
Congruent_Linear_Equation_Groupcc;
intmain(){
inta,b,c,d,i=0;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
if(a==-1&&b==-1&&c==-1&&d==-1){
break;
}
i++;
cc.clear();
a%=23;
b%=28;
c%=33;
cc.addEquation(a,23);
cc.addEquation(b,28);
cc.addEquation(c,33);
intx=cc.getSolution();
if(x<=d){
x+=21252;
}
while(x-21252>d)x-=21252;
printf("Case%d:thenexttriplepeakoccursin%ddays.\n",i,x-d);
}
return0;
}


ViewCode


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: