poj1006 生理週期(中國剩餘定理)
阿新 • • 發佈:2019-02-07
生理週期
輸入四個整數:p, e, i和d。 p, e, i分別表示體力、情感和智力高峰出現的時間(時間從當年的第一天開始計算)。d 是給定的時間,可能小於p, e, 或 i。 所有給定時間是非負的並且小於365, 所求的時間小於21252。
當p = e = i = d = -1時,輸入資料結束。
採用以下格式:
Case 1: the next triple peak occurs in 1234 days.
注意:即使結果是1天,也使用複數形式“days”。
Time Limit: 1000MS | Memory Limit: 10000K |
Total Submissions: 122157 | Accepted: 38518 |
Description
人生來就有三個生理週期,分別為體力、感情和智力週期,它們的週期長度為23天、28天和33天。每一個週期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力週期的高峰,人會思維敏捷,精力容易高度集中。因為三個週期的周長不同,所以通常三個週期的高峰不會落在同一天。對於每個人,我們想知道何時三個高峰落在同一天。對於每個週期,我們會給出從當前年份的第一天開始,到出現高峰的天數(不一定是第一次高峰出現的時間)。你的任務是給定一個從當年第一天開始數的天數,輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天的時間(距給定時間的天數)。例如:給定時間為10,下次出現三個高峰同天的時間是12,則輸出2(注意這裡不是3)。Input
當p = e = i = d = -1時,輸入資料結束。
Output
從給定時間起,下一次三個高峰同天的時間(距離給定時間的天數)。採用以下格式:
Case 1: the next triple peak occurs in 1234 days.
注意:即使結果是1天,也使用複數形式“days”。
Sample Input
0 0 0 0 0 0 0 100 5 20 34 325 4 5 6 7 283 102 23 320 203 301 203 40 -1 -1 -1 -1
Sample Output
Case 1: the next triple peak occurs in 21252 days. Case 2: the next triple peak occurs in 21152 days. Case 3: the next triple peak occurs in 19575 days. Case 4: the next triple peak occurs in 16994 days. Case 5: the next triple peak occurs in 8910 days. Case 6: the next triple peak occurs in 10789 days.
Source
題意:中文題,題意啥的就不多說了。 分析:典型的中國剩餘定理題,答案就是(r1*p+r2*e+r3*k-d)%r,實在不知道怎麼解釋,如果懂中國剩餘定理,這就是a+b的水題,不懂的話點這裡#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define ll long long
#define CL(a) memset(a,0,sizeof(a))
int p,e,k,d,sum;
int r1,r2,r3,r;
void slove()//求出r1,r2,r3,r;
{
int i;
for (i=1, r1=28*33; ; i++)
if (r1*i%23==1) break;
r1 *= i;
for (i=1, r2=23*33; ; i++)
if (r2*i%28==1) break;
r2 *= i;
for (i=1, r3=23*28; ; i++)
if (r3*i%33==1) break;
r3 *= i;
r = 23*28*33;
}
int main ()
{
int ii=1;
slove();
//cout<<r1<<" "<<r2<<" "<<r3<<" "<<r<<endl;
while (scanf ("%d%d%d%d",&p,&e,&k,&d)==4)
{
if (p==-1&&e==-1&&k==-1&&d==-1)
break;
sum = (r1*p+r2*e+r3*k-d)%r;//中國剩餘定理求解
sum = (sum+r-1)%r+1;//可能會出現負數
printf ("Case %d: the next triple peak occurs in %d days.\n",ii++, sum);
}
return 0;
}