POJ1006演算法解析

2021-08-04 21:14:16 字數 2523 閱讀 8991

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天。每乙個週期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力週期的高峰,人會思維敏捷,精力容易高度集中。因為三個週期的周長不同,所以通常三個週期的高峰不會落在同一天。對於每個人,我們想知道何時三...