Head For Better 中國剩餘定理

2021-08-14 23:51:04 字數 2875 閱讀 8738

問題描述

人自出生起就有體力,情感和智力三個生理週期,分別為23,28和33天。乙個週期內有一天為峰值,在這一天,人在對應的方面(體力,情感或智力)表現最好。通常這三個週期的峰值不會是同一天。現在給出三個日期,分別對應於體力,情感,智力出現峰值的日期。然後再給出乙個起始日期,要求從這一天開始,算出最少再過多少天後三個峰值同時出現。

問題分析

首先我們要知道,任意兩個峰值之間一定相距整數倍的週期。假設一年的第n天達到峰值,則下次達到峰值的時間為n+tk(t是週期,k是任意正整數)。所以,三個峰值同時出現的那一天(s)應滿足

s = n1 + t1*k1 = n2 + t2*k2 = n3 + t3*k3

n1,n2,n3分別為為體力,情感,智力出現峰值的日期, t1,t2,t3分別為體力,情感,智力週期。 我們需要求出k1,k2,k3三個非負整數使上面的等式成立。

想直接求出k1,k2,k3貌似很難,但是我們的目的是求出s, 可以考慮從結果逆推。根據上面的等式,s滿足三個要求:除以t1餘數為n1,除以t2餘數為n2,除以t3餘數為n3。這樣我們就把問題轉化為求乙個最小數,該數除以t1餘n1,除以t2餘n2,除以t3餘n3。這就是著名的中國剩餘定理,我們的老祖宗在幾千年前已經對這個問題想出了乙個精妙的解法。依據此解法的演算法,時間複雜度可達到o(1)。下面就介紹一下中國剩餘定理。

中國剩餘定理介紹

在《孫子算經》中有這樣乙個問題:「今有物不知其數,三三數之剩二(除以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*2)得到和233。

用233除以3,5,7三個數的最小公倍數105,得到餘數23,即233%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+kb)%b=c(k為非零整數),換句話說,如果乙個除法運算的餘數為c,那麼被除數與k倍的除數相加(或相減)的和(差)再與除數相除,餘數不變。這個是很好證明的。

以此定理為依據,如果n2是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。

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

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

經過分析發現,中國剩餘定理的孫子解法並沒有什麼高深的技巧,就是以下兩個基本數學定理的靈活運用:

如果 a%b=c , 則有 (a+kb)%b=c (k為非零整數)。

如果 a%b=c,那麼 (a*k)%b=kc (k為大於零的整數)。

**:

#include #include #include #include #include #include #include #include #include #include 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 main ()

return 0;

}

「中國製造」與「中國創造」

前幾天偶然在論壇裡看到這樣乙個帖子,說是身在國外的兩名中日兩國留學生因為歷史遺留問題而爭論不休。不可調和之下,國人要求對方把身上屬於中國的東西還回來,於是日本留學生從裡到外的衣服 錢包 鞋子 凡是標有 made in china 的物品統統收入國人手中。乍一看,這似乎是國人在抗日上又取得的一場勝利,...

中國搜尋,如何「搜尋中國」?

相較於20年前資訊匱乏的時代,現代社會的乙個特徵就是資訊過載。相對於資訊的海量,受眾 使用者更需要資訊的質感。說這句話的是在 行業工作多年的資深 人老陽。20年前,中國網際網路行業還未發展起來,人們對資訊的獲取主要來自廣播電視 報紙雜誌等傳統渠道。那時,資訊雖然多數從權威渠道發出,但人們整體的感覺是...

贏在中國與中國IT培訓

贏在中國這個節目在2006年引起了巨大反響,由於中途才知道這個節目,而且每週二經常忘記收看,所以看的斷斷續續,隨著第一季的結束,這幾期節目開始回顧上一季的前五名選手,這幾期都看了。第一名和第三名的選手做的都是人力勞務輸出這一塊,因為對這塊市場還是有些了解所以記錄一下自己的感受。第一名和第三名選手的專...