警告:這不是一道水題
說真的,連著刷了5道水題,突然間碰到這道題還真的有點不適應。。。。
題目大意:
有三個迴圈週期:23,28,33。
再給你乙個起始日期:d
求:從d天後再過多少天三個週期能同時達到峰值?
有木有乍一看很簡單,細想想卻又無從下手的趕腳?
拋開這道題,我們先研究乙個很古老卻又很深奧的問題:中國剩餘定理
《孫子算經》中有「物不知數」問題:「今有物不知其數,三三數之餘二 ,五五數之餘三 ,七七數之餘二,問物幾何?」
翻譯一下就是n % 3 = 2, n % 5 = 3, n % 7 = 2; 問n是多少?
再回過頭來看題,假設n天後三個週期能同時達到峰值。是不是能夠得到:
(n+d) % 23 = p;
(n+d) % 28 = e;
(n+d) % 33 = i;
看看看,是不是一毛一樣!
好了,現在該研究研究怎麼求這個n了。。。
現在的已知條件只有n % 3 = 2, n % 5 = 3, n % 7 = 2。
我們拆開來看這三個條件,假設有3個數n1,n2,n3
使得n1能夠整除5跟7,但是n1%3=2
使得n2能夠整除3跟7,但是n2%5=3
使得n3能夠整除3跟5,但是n3%7=2
是不是(n1+n2+n3) % 3 = 2, (n1+n2+n3) % 5 = 3, (n1+n2+n3) % 7 = 2就成立了!
好了,接下來我們在看看n1,n2,n3該怎麼求
假設a能夠整除5跟7,a%3=1。那麼a*2 % 3=2成立
假設b能夠整除3跟7,b%7=1。那麼b*3 % 5=3成立
假設c能夠整除3跟5,c%7=1。那麼c*2 % 7=2成立
所以:a=70,b=21,c=15
所以:n1=140,n2=63,n3=30
所以:n=233!
但是233明顯不是最優解;
n=233 % 105(3,5,7的最小公倍數)=23
bingo!
再回過頭來看poj1006,求這裡面的a,b,c
a=5544
b=14421
c=1288
day = (5544 * p + 14421 * e + 1288 * i - d + 21252) % 21252;
**如下:
#include using namespace std;
int main()
return 0;
}
從拾ACM poj1001解題報告
事情一件件來,水題一道道刷。1001是一道典型的高精度問題,重點是處理字串。最後需要按照題目的輸出標準來輸出答案就可以了 include includeint output 120 第一位為1,方便計算 int m num是去掉小數點後的十進位制數字,比如95.23變為9523 因為我們要乘的數是固...
從拾ACM poj1002解題報告
一道很基礎的字串處理問題。題目大意 給你n個字串,其中有一些字串是等價的。因為 a,b,and c 等於 2 d,e,and f 等於 3 g,h,and i 等於 4 j,k,and l 等於 5 m,n,and o 等於 6 p,r,and s 等於 7 t,u,and v 等於 8 w,x,a...
從拾ACM poj1007解題報告
求字串的逆序數,並按逆序數大小排序輸出 題目大意 給出長度為n的m個字串 每個字串由a,c,g,t組成。按照每個字串的逆序數大小一次輸出每個字串 如下 include using namespace std typedef struct struct void nixushu struct data...