1. 程式人生 > >POJ 1006: 中國剩餘定理

POJ 1006: 中國剩餘定理

問題描述

 人自出生起就有體力,情感和智力三個生理週期,分別為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),問物幾何?”這個問題稱為“孫子問題”,該問題的一般解法國際上稱為“中國剩餘定理”。具體解法分三步:
  1. 找出三個數:從3和5的公倍數中找出被7除餘1的最小數15,從3和7的公倍數中找出被5除餘1 的最小數21,最後從5和7的公倍數中找出除3餘1的最小數70。

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

  3. 用233除以3,5,7三個數的最小公倍數105,得到餘數23,即2335=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的角度出發,我們可推匯出以下三點:
  1. 為使n1+n2+n3的和滿足除以3餘2,n2和n3必須是3的倍數。

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

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

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

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

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

  6. 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)5就是最終的最小解。

同樣,這道題也應該是:

  1. n1除以23餘p,且是28和33的公倍數。

  2. n2除以28餘e,且是23和33的公倍數。

  3. n3除以33餘i,且是23和28的公倍數。

    使33×28被23除餘1,用33×28×8=5544;
    使23×33被28除餘1,用23×33×19=14421;
    使23×28被33除餘1,用23×28×2=1288。
    (5544×p+14421×e+1288×i)%(23×28×33)=n+d
    n=(5544×p+14421×e+1288×i-d)%(23×28×33)

程式碼:

#include <iostream>

#include <stdio.h>

using namespace std;



int main()

{

    int p,e,i,d,case_n = 0;

    __int64 day;

    while (scanf("%d %d %d %d",&p,&e,&i,&d) != EOF)

    {

        case_n++;

        if (p == -1 && e ==-1 && i ==-1 && d == -1)break;

        p %= 23; e %= 28; i %= 33;

        day = (21252 + 5544*p + 14421*e + 1288*i - d)!252;

        if (day == 0) day = 21252;

        printf("Case %d: the next triple peak occurs in %I64d days.\n",case_n,day);

    }

    return 0;

}

總結

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

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

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

感謝!

相關推薦

Biorhythms POJ - 1006 (中國剩餘定理)

傳送門 題意:已知一個人的身體,智力和情感的迴圈週期,然後給出一個人身體,智力和情感的開始值,最後再給出一個固定時間,問在下一次三個共同達到峰值的時間在這個固定時間多長時間後。 題解:中國剩餘定理板題,首先得了解拓展gcd,知道了這個後,再瞭解下求逆元傳送門,在看下百科上的解釋就懂了傳送門,

POJ 1006 中國剩餘定理

初見poj1006用的暴力破解寫的程式碼,寫完以後發現很搓。上網一查原來古人早就對此類問題有了解答規則。 一、中國剩餘定理 一元線性同餘方程組問題最早可見於中國南北朝時期(公元5世紀)的數學著作《孫子算經》卷下第二十六題,叫做“物不知數”問題,原文如下: 有物不知其數

POJ 1006: 中國剩餘定理

問題描述 人自出生起就有體力,情感和智力三個生理週期,分別為23,28和33天。一個週期內有一天為峰值,在這一天,人在對應的方面(體力,情感或智力)表現最好。通常這三個週期的峰值不會是同一天。現在給出三個日期,分別對應於體力,情感,智力出現峰值的日期。然後再

poj 1006中國剩餘定理的應用

這道題主要講的是人有是哪個生理週期,分別是身體,情感和智力,這三個週期,他們的為其時間是23,28和33.已經知道這一年裡從第一天開始第一個生理週期出現的時間分別是P,e,i這三天,現在要求計算d天后

Poj 1006 Biorhythms 中國剩餘定理

Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the phys

POJ 1006】【CRT(中國剩餘定理)模板題】Biorhythms

描述: Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 130935 Accepted: 41750 Description Some people believe

poj 1006 Biorhythms(中國剩餘定理

自己的題解略混亂(再看自己都沒看懂)所以還是貼一個神犇的講解(十分簡單易懂) 題目大意: 人有三個生理週期,給出三個週期的初始日期,請求出多少天后三個生理週期同時出現。 體力週期–23天 感情週

poj 1006 Biorhythms(中國剩餘定理的應用)

Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 125633 Accepted: 39673 Description Some people believe that

POJ-1006-Biorhythms(中國剩餘定理

Biorhythms Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These

POJ 1006 ——Biorhythms 中國剩餘定理模板

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 112928 Accepted: 35337 Description Some people believe that there are th

中國剩餘定理POJ Biorhythms 1006

You will be given a number of cases. The input for each case consists of one line of four integers p, e, i, and d. The values p, e, and i are the number o

poj 1006 Biorhythms(中國剩餘定理

題意: x === p ( mod 23 ) x === e ( mod 28 ) x === i ( mod 33 ) 給p e i ,求x 。 解析: 23 28 33互素,所以用中國剩餘定理做。 用之前的解同餘方程組的方法也試了試,很噁心,樣例裡面有0 0 0 0

poj 1006 生理週期 【中國剩餘定理

生理週期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117999 Accepted: 37040 Description 人生來就有三個生理週期,分別為體力

中國剩餘定理 poj 1006 poj2891

Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 129686 Accepted: 41277 Description Some people believe that

POJ 1006 Biorhythms (中國剩餘定理

大意:有中文翻譯 思路:中國剩餘定理的完美詮釋 中國剩餘定理介紹      在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二(除以3餘2),五五數之剩三(除以5餘3),七七數之剩二(除以7餘2),問物幾何?”這個問題稱為“孫子問題”,該問題的一般解法國際上稱

POJ 1006:Biorhythms 中國剩餘定理

Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 121194 Accepted: 38157 Description Some people believe that

poj 2891 Strange Way to Express Integers 中國剩餘定理模板

Description   Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is descr

poj 2891 Strange Way to Express Integers 中國剩餘定理模板

Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is d

Biorhythms POJ - 1006 中國剩余定理

occurs 中國剩余定理 天數 rip void 第一天 就是 spa csdn 定理證明:https://blog.csdn.net/d_x_d/article/details/48466957 https://blog.csdn.net/lyy289065406/ar

Hdu 1573 X問題 中國剩餘定理模板

  Problem Description 求在小於等於N的正整數中有多少個X滿足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <=