poj1006
生理週期
time limit: 1000ms memory limit: 10000k
total submissions: 137970 accepted: 44170
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
從給定時間起,下一次三個高峰同天的時間(距離給定時間的天數)。
採用以下格式:
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.
整個題目的核心可以轉化為在輸入p,e,i,d的情況下,從以下的三個方程中解出最小的num
(d+num)%23=p;
(d+num)%28=e;
(d+num)%33=i;
《孫子算經》中有「物不知數」問題:「今有物不知其數,三三數之餘二 ,五五數之餘三 ,七七數之餘二,問物幾何?」答為「23」。
這個就是「中國剩餘定理」。 其實題目的意思就是,n % 3 = 2, n % 5 = 3, n % 7 = 2; 問n是多少?
題目中涉及 3, 5,7三個互質的數.
令:5 * 7 * a % 3 = 1; ————–> a = 2; 即5 * 7 * 2 = 70;
3 * 7 * b % 5 = 1; --------------> b = 1; 即3 * 7 * 1 = 21;
3 * 5 * c % 7 = 1; --------------> c = 1; 即3 * 5 * 1 = 15;
為什麼要使餘數為1:是為了要求餘數2的話,只要乘以2就可以,要求餘數為3的話,只要乘以3就可以.
( 因為題目想要n % 3 =2, n % 5 =3, n % 7 =2; )
那麼:要使得n % 3 = 2,那麼( 5 * 7 * 2 )2 % 3 = 2;( 因為5 7 * 2 % 3 = 1 )
同理: 要使得n % 5 = 3,那麼( 3 * 7 * 1 )3 % 5 = 3;( 因為3 7 * 1 % 5 = 1 )
同理:要使得n % 7 = 2,那麼( 3 * 5 * 1 )* 2 % 7 = 2;( 因為3 * 5 * 1 % 7 = 1 )
在此基礎上,將三個數相加得到的數也同時滿足三個餘數關係。
但此時得到的值並不是最小的,當這個值除三個被除數的積得到的餘數,才為最小值。
33 % ( 3 * 5 * 7 ) == 23;
23就是這麼來的。
ac**(c語言)
#include
#define max 21252
#define a 5544
#define b 14421
#define c 1288
#define false -1
int main()
return
0;
}
POJ 1006 數論簡單題
不用中國剩餘定理的知識,直接簡單模擬 include using namespace std const int pc 23,ep 28,ip 33 int p,e,i,d bool judge int ans int main ans return 0 上面的簡單模擬,差一點就超時了,估計在uva...
POJ 1006 與中國剩餘定理
要點 設num為下乙個triple peak出現的時間。則可以得到以下三個等式 num 23 p num 28 e num 33 i 使用暴力列舉法會遇到問題 如當p 23時無法用 得到p,但這裡學到了一種新演算法 中國剩餘定理演算法,可繞過這個問題。中國剩餘定理介紹 孫子算經 中有 物不知數 問題...
列舉 案例(生理週期poj1006)
人生來就有三個生理週期,分別為體力 感情和智力週期,它們的週期長度為23天 28天和33天。每乙個週期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力週期的高峰,人會思維敏捷,精力容易高度集中。因為三個週期的周長不同,所以通常三個週期的高峰不會落在同一天。對於每個人,我們想知道何時三...