8月20日考試T3 題解(數論 動態規劃)

2022-03-26 10:15:33 字數 2633 閱讀 1903

此題太毒瘤了,以至於我單獨為它寫一篇題解。

題目大意:任何自然數都可以用$2$的整數冪之和來表示。現在給定$t$組資料,每組乙個$n$,求$n$用$2$的整數冪之和表示的方案數。$n\leq 10^$

首先科普一波伯努利數:

設自然數冪和$s_(n)=\sum\limits_^ i^k$

將其用關於$n$的$m+1$次多項式表示,在其中定義伯努利數$b_i$為:

$s_k(n)=\frac\sum\limits_^k c_^i b_d n^$

將$n=1$帶入得:

$b_0=1\ (m=0),\sum\limits_^k c_^ib_i\ (m>0)$

於是可以$o(k^2)$求出$b_k$。

其正確性可以用生成函式證明。貼連線:

首先乙個普遍的做法應該能想到:設$f_n$表示$n$的方案數,那麼通過打表有$f_n=\sum\limits_^ \rceil }f_j$。我們考慮轉化一下這個式子:

$f_n=\sum\limits_^ \rceil }f_j$

$=\sum\limits_^ \rfloor}\sum\limits_^ \rfloor} f_i$

$=\sum\limits_^ \rfloor} f_i\sum\limits_^ \rfloor}1$

$=\sum\limits_^ \rfloor} f_i(s_0(\lfloor \frac \rfloor+1)-s_0(2i))$

$=\sum\limits_^ \rfloor} f_is_0(\lfloor \frac \rfloor+1)-2\sum\limits_^ \rfloor} f_i\times i$

發現前半部分很好解決,難的地方在於後面這個形如$\sum\limits_^n f_i \times i^k$的式子。我們嘗試解這個式子:

設$f(n,k)=\sum\limits_^i^k$

$\sum\limits_^n f_i \times i^k$

$=\sum\limits_^n i^k\sum\limits_^ \rfloor}f_j$

$=\sum\limits_^ \rfloor}f_j\sum\limits_^n i^k$

$=\sum\limits_^ \rfloor}f_j(s_k(n+1)-s_k(2j))$

$=\sum\limits_^ \rfloor}f_js_k(n+1)-\sum\limits_^ \rfloor}f_j\sum\limits_^\frac^d}b_(2j)^d$

$=\sum\limits_^ \rfloor}f_js_k(n+1)-\sum\limits_^\frac^d}b_2^d\sum\limits_^ \rfloor} f_j \times j^d$

$=f(\lfloor \frac \rfloor,0)s_k(n+1)-\sum\limits_^\frac^d}b_2^df(\lfloor \frac \rfloor ,d)$

發現左邊是子問題,右邊$k$最多是$\log n$。狀態數$\log^2 n$,轉移$\log n$,複雜度$o(t\log^3 n)$。記憶化搜尋實現。

(跟爆long long戰鬥了兩個小時的我qaq,碼風可能有點醜,見諒

最好手寫雜湊表,用map複雜度多乙個log,會被卡常。也可以用unordered_map

**:

#include#define int long longtypedef 

long

long

ll;using

namespace

std;

const

int maxn=100

;const

int mod=1e9+7

;int b[70],c[70][70],f[155][70],inv[70

];int

t,n,tot;

inline ll read()

while(isdigit(ch))

return x*f;

}inline

int qpow(int x,int

y)

return res%mod;

}inline

void

init()

}const

int p=13331

;struct

hedge[maxn*2

]; inline

void init()

inline

void add(int to,int

val)

inline

int find(int

v)

return -1

; }

}hash;

inline

int dp(ll n,int

k)

int res=0,tmp=(n+1)%mod;

for (int d=1;d<=k+1;d++)

res=(res%mod*dp(n>>1,0)%mod)%mod;

for (int d=1;d<=k+1;d++)

return f[x][k]=res;

}inline

void

work()

signed main()

return0;

}

8月20日考試題解(思維題 貪心 數論 動態規劃)

t2打暴力都能拿80分,可怕。t1題目大意 給定乙個實數序列 a 設 s sum n a i 你可以做下列操作 n 次 選擇兩個未被選過的下標 i,j 將 a i 變為不超過 a i 的最大整數,將 a j 變為不小於 a j 的最小整數。要求操作完成後新的序列中元素之和與原來的差值的絕對值盡可能小...

2023年8月16日提高組T3 旅館

有一間旅館,旅館內有n間排成一排的房間,一開始全為空。現在有m個要求 1 d表示詢問旅館內是否有連續d間空房間,有的話則輸出最小的乙個r,滿足從r開始連續d間房間均為空,同時會有人入住這d間房。若無法被滿足,則輸出0.2 l r表示把 l,r 內的房間全部設為空。第一行兩個整數n,m.接下來m行,每...

2023年8月7日提高組T3 選數

給出n個數a i 現在可以在其中任意選出若干個數,問有多少種選擇方案,使得這幾個數可以分成兩個和相等的集合。第一行是乙個正整數n,第二行每行n個正整數。輸出乙個數,表示方案數。對於30 的資料,n 10.對於100 的資料,n 20,a i 100000000.by bpm 略難每個數字前可以填1 ...