孫子定理:web
大意:spa
孫子算經裏有這樣一個問題:「今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?」翻譯
翻譯成如今的數學問題就是 x%3 == 2,x%5 == 3,x%7 == 2,求x 的值;code
遇到這這樣一個問題不少C語言初學者不由會想到用暴力能夠算出來,還要這樣一個定理幹嗎?orm
若是數據至關大呢?計算機就會計算至關困難。然而這個問題早早的就被孫子解決了。ip
求出3,5,7 兩兩中的最小公倍數lcm,k*lcm與另外一個數mod等於1(找出一個符合條件的k);數學
用k*lcm*另外一個沒有在lcm中的數的等式的餘數 [(有點繞)就是 lcm(3,5),另外一個數就是7 在x%7==2 的等式中的餘數 就是2 即找出這k*lcm(3,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,這個數最小是幾?
題中3、4、5三個數兩兩互質。 則〔4,5〕=20;〔3,5〕=15;〔3,4〕=12;〔3,4,5〕=60。
爲了使20被3除餘1,用20×2=40; 使15被4除餘1,用15×3=45; 使12被5除餘1,用12×3=36。
而後,40×1+45×2+36×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; }