題目
參考了別人找的規律再理解
/*view code8=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;
}
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...