中國剩餘定理

2021-09-10 04:14:00 字數 3652 閱讀 8024

生理週期

time limit:1000ms

memory limit:10000k

total submissions:148854

accepted:48087

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.

首先介紹下中國剩餘定理:

在《孫子算經》中有這樣乙個問題:「今有物不知其數,三三數之剩二(除以3餘2),五五數之剩三(除以5餘3),七七數之剩二(除以7餘2),問物幾何?」這個問題稱為「孫子問題」,該問題的一般解法國際上稱為「中國剩餘定理」。具體解法分三步:

找出三個數:從3和5的公倍數中找出被7除餘1的最小數15,從3和7的公倍數中找出被5除餘1 的最小數21,最後從5和7的公倍數中找出除3餘1的最小數70。

用15乘以2(2為最終結果除以7的餘數),用21乘以3(3為最終結果除以5的餘數),同理,用70乘以2(2為最終結果除以3的餘數),然後把三個乘積相加15∗2+21∗3+70∗215∗2+21∗3+70∗2得到和233。

用233除以3,5,7三個數的最小公倍數105,得到餘數23,即233%105=23233%105=23。這個餘數23就是符合條件的最小數。

就這麼簡單。我們在感嘆神奇的同時不禁想知道古人是如何想到這個方法的,有什麼基本的數學依據嗎?

我們將「孫子問題」拆分成幾個簡單的小問題,從零開始,試圖揣測古人是如何推導出這個解法的。

首先,我們假設n1是滿足除以3餘2的乙個數,比如2,5,8等等,也就是滿足3∗k+2(k>=0)的乙個任意數。同樣,我們假設n2是滿足除以5餘3的乙個數,n3是滿足除以7餘2的乙個數。

有了前面的假設,我們先從n1這個角度出發,已知n1滿足除以3餘2,能不能使得n1+n2的和仍然滿足除以3餘2?進而使得n1+n2+n3的和仍然滿足除以3餘2?

這就牽涉到乙個最基本數學定理,如果有a%b=c,則有(a+k∗b)%b=c(k為非零整數),換句話說,如果乙個除法運算的餘數為cc,那麼被除數與k倍的除數相加(或相減)的和(差)再與除數相除,餘數不變。這個是很好證明的。

以此定理為依據,如果n2n2是3的倍數,n1+n2就依然滿足除以3餘2。同理,如果n3也是3的倍數,那麼n1+n2+n3的和就滿足除以3餘2。這是從n1的角度考慮的,再從n2,n3的角度出發,我們可推導出以下三點:

為使n1+n2+n3的和滿足除以3餘2,n2和n3必須是3的倍數。

為使n1+n2+n3的和滿足除以5餘3,n1和n3必須是5的倍數。

為使n1+n2+n3的和滿足除以7餘2,n1和n2必須是7的倍數。

因此,為使n1+n2+n3的和作為「孫子問題」的乙個最終解,需滿足:

n1除以3餘2,且是5和7的公倍數。

n2除以5餘3,且是3和7的公倍數。

n3除以7餘2,且是3和5的公倍數。

所以,孫子問題解法的本質是從5和7的公倍數中找乙個除以3餘2的數n1,從3和7的公倍數中找乙個除以5餘3的數n2,從3和5的公倍數中找乙個除以7餘2的數n3,再將三個數相加得到解。在求n1,n2,n3時又用了乙個小技巧,以n1為例,並非從5和7的公倍數中直接找乙個除以3餘2的數,而是先找乙個除以3餘1的數,再乘以2。也就是先求出5和7的公倍數模3下的逆元,再用逆元去乘餘數

這裡又有乙個數學公式,如果a%b=c,那麼(a∗k)%b=a%b+a%b+…+a%b=c+c+…+c=k∗c(k>0),也就是說,如果乙個除法的餘數為c,那麼被除數的k倍與除數相除的餘數為k∗c。展開式中已證明。

最後,我們還要清楚一點,n1+n2+n3只是問題的乙個解,並不是最小的解。如何得到最小解?我們只需要從中最大限度的減掉掉3,5,7的公倍數105即可。道理就是前面講過的定理「如果a%b=c,則有(a−k∗b)%b=c」。所以(n1+n2+n3)%105(n1+n2+n3)%105就是最終的最小解。

本題思路:

已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i 

使33×28×a被23除餘1,用33×28×8=5544; 

使23×33×b被28除餘1,用23×33×19=14421; 

使23×28×c被33除餘1,用23×28×2=1288。 

因此有(5544×p+14421×e+1288×i)% lcm(23,28,33) =n+d 

又23、28、33互質,即lcm(23,28,33)= 21252;

所以有n=(5544×p+14421×e+1288×i-d)%21252

本題所求的是最小整數解,避免n為負,因此最後結果為n= [n+21252]% 21252

那麼最終求解n的表示式就是:

n=(5544*p+14421*e+1288*i-d+21252)%21252;

ac**:

#includeusing namespace std;

int main(void)

return 0;

}

中國剩餘定理 擴充套件中國剩餘定理

中國剩餘定理 對於求解一元不定方程組 的一種演算法叫做中國剩餘定理。又名孫子定理。其中m1,m2,m3.mk 為兩兩互質的整數,求x的最小非負整數解 令m mi 1 i n m是所有mi的最小公倍數 ti為同餘方程 ti m mi 1 mod mi 的最小非負整數解 則有乙個解 x ai m mi ...

中國剩餘定理

用來求解模數互質的同餘方程組,即求乙個數x,使得x除以n個模數分別為a1,a2,a3 an 注意這裡的除數必須要兩兩互質 得到n個餘數r1,r2,r3 rk。求這個數x.中國剩餘定理求的就是這個數x。求解過程 1 令p a1 s2 a3 an,ki p ai i從1到n 2 我們要找到這樣的數 di...

中國剩餘定理

中國剩餘定理介紹 在 孫子算經 中有這樣乙個問題 今有物不知其數,三三數之剩二 除以3餘2 五五數之剩三 除以5餘3 七七數之剩二 除以7餘2 問物幾何?這個問題稱為 孫子問題 該問題的一般解法國際上稱為 中國剩餘定理 具體解法分三步 找出三個數 從3和5的公倍數中找出被7除餘1的最小數15,從3和...