POJ 2229 Sumsets(找規律,預處理)

2022-08-20 01:27:12 字數 851 閱讀 7022

題目

參考了別人找的規律再理解

/*

8=1+1+1+1+1+1+1+1+1 1

8=1+1+1+1+1+1+1+2 2 3

8=1+1+1+1+2+2

8=1+1+1+1+4 4 5

8=1+1+2+2+2

8=1+1+2+4 6 7

8=2+2+2+2

8=2+2+4

8=4+4

8=8 8~9

*//*

以下引用自部落格:

如果i為奇數,肯定有乙個1,把f[i-1]的每一種情況加乙個1就得到fi,所以f[i]=f[i-1]

如果i為偶數,如果有1,至少有兩個,則f[i-2]的每一種情況加兩個1,就得到i,如果沒有1,則把分解式中的每一項除2,則得到f[i/2]

所以f[i]=f[i-2]+f[i/2]

由於只要輸出最後9個數字,別忘記模1000000000

*/#include

#include

#include

#include

#include

#include

using

namespace

std;

int a[1000010

];int

main()

intn;

while(scanf("

%d",&n)!=eof)

return0;

}

view code

POJ 2229 Sumsets(遞推,找規律)

構造,遞推,因為劃分是合併的逆過程,考慮怎麼合併。先把n展開成全部為n個1 然後合併,因為和順序無關,所以只和出現次數有關 情況有點多並且為了避免重複,分類,c i 表示序列中最大的數為2 i時的方案數 樹形表示合併 uva 10562 undraw the trees的表示方法。7 2 0 7表示...

POJ2549 Sumsets 折半列舉

題目大意是,乙個集合中有n個元素,找出最大的s,滿足條件a b c s,並且這四個數都屬於該集合,n不超過1000.如果直接列舉o n 4 顯然複雜度太高,將等式轉化一下a b s c,此時分別對左右兩邊的值進行列舉,這一步複雜度為o n 2 接著就用二分法查詢滿足該等式的最大s值,複雜度為o n ...

POJ 2549 Sumsets 折半列舉

題意 在集合s中有n個數,找到最大的d,且d滿足於集合內a b c d。題解 我們把找a b c d化為找 a b d c。設c為a,b,c中最大的元素。注意d不一定比c大,d c可以為負數。這樣我們列舉d,c,利用二分的思想查詢a,b。如下 include include include defi...