中國剩餘定理(孫子定理)

孫子定理:web

大意:spa

 

孫子算經裏有這樣一個問題:「今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?翻譯

翻譯成如今的數學問題就是 x%3 == 2x%5 == 3x%7 ==  2,的值;code

遇到這這樣一個問題不少C語言初學者不由會想到用暴力能夠算出來,還要這樣一個定理幹嗎?orm

若是數據至關大呢?計算機就會計算至關困難。然而這個問題早早的就被孫子解決了。ip

 求出3,5,7 兩兩中的最小公倍數lcmk*lcm與另外一個數mod等於1(找出一個符合條件的k);數學

  用k*lcm*另外一個沒有在lcm中的數的等式的餘數  [(有點繞)就是 lcm(3,5),另外一個數就是x%7==2 的等式中的餘數 就是即找出這k*lcm3,5*2]it

求法(剩餘定理思想)io

  Lcm(3,5) = 15;   // lcm是最小公倍數 ast

  Lcm(3,7) = 21;

  Lcm(5,7) = 35;

  a*15%7 == 1;

  b*21%5 == 1;

  c*35%3 == 1;

  可求得a,b,c的值爲1,1,2;

  咱們可得15%7 == 1 , 21%5 == 1 , 70%3 == 1

  Ans = (15*2 + 21*3 + 70*2) % lcm(3,5,7);  

  Ans = 23;

再加一個例題

一個數被3除餘1,被4除餘2,被5除餘4,這個數最小是幾?

 題中345三個數兩兩互質。 則〔45=20;〔35=15;〔34=12;〔345=60 

爲了使203除餘1,用20×2=40 使154除餘1,用15×3=45 使125除餘1,用12×3=36 

而後,40×145×236×4=274 

由於,274>60

因此,274%60 = 34,就是所求的數。

 例題:

 

生理週期
Time Limit: 1000MS  Memory Limit: 10000K
Total Submissions: 112648  Accepted: 35207
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.
Source

East Central North America 1999

 

這道題的解法就是: 

已知(ans+d)%23=a;   (ans+d)%28=b;   (ans+d)%33=c 
       使33×28×X被23除餘1,用33×28×8 = 5544; 
       使23×33×Y被28除餘1,用23×33×19 = 14421; 
       使23×28×Z被33除餘1,用23×28×2 = 1288。

      因而X==8, Y==19, Z==2; 
      所以有(5544×a + 14421×b + 1288×c)% lcm(23,28,33) =ans + d 

又2三、2八、33互質,即lcm(23,28,33) = 21252;
      因此有ans =(5544×a+14421×b+1288×c-d)% 21252

code:

#include <stdio.h>
int main()
{
    int p,e,i,n,sum,t;
    t=0;
    while(scanf("%d%d%d%d",&p,&e,&i,&n),p+e+i+n!=-4)
    {
        sum=(5544*p+14421*e+1288*i)%21252;
        if(sum-n<=0)
            sum+=21252;
        printf("Case %d: the next triple peak occurs in %d days.\n",++t,sum-n);
    }
    return 0;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息