NOIP2021提高組題目解析
阿新 • • 發佈:2022-01-02
我真的是太菜了,....,隨便點開個NOIP提高組的題目就不會做,真的是懷疑當初自己是怎麼拿到省一的.....
P7961 [NOIP2021] 數列
先來看一道有意思的計數題,(計數題真的是我的弱項...)
題意大概:給定數列\(v_0,v_1,...,v_m\),從\(0,1,...,m\)中選出n個組成序列\(a_i\)(可以重複選)。要求\(2^{a_0}+2^{a_1}+...+2^{a_m}\)的二進位制下1的個數不大於k,問所有\(v_{a_i}\)的乘積和。
首先我們考慮選擇的序列a,因為要考慮到進位的問題,所以我們不妨規定a是不減的。接下來考慮怎麼處理這個二進位制下1的個數的問題。一個比較好的想法就是將當前的進位我們都停留在當前的i。就是我們把他的進位都轉化成我們當前正在處理的數上,這樣方便我們量化和處理。根據這些,我們可以大致的設一個狀態\(f[i][j][k][num]\)
\(f[i][j][k][num]=\sum(C_i^x*f[i-x][j-1][k-pocent(num)+pocnet(num-x)][temp]*v[j]^x)\),其中pocent(x)表示x的二進位制下1的個數,temp/2+x=num.這樣就完美的解決了問題。考慮時間複雜度,\(O(n^4m)\)大概可以的。