從拾ACM poj1006解題報告

2021-10-01 01:57:35 字數 1346 閱讀 6448

警告:這不是一道水題

說真的,連著刷了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...