T3
思路:按位分治
大概就是從高到低考慮二進制的每一位
設\(solve(S,i)\)表示當前我們考慮在\(S\)這個集合中選,當前只需要考慮只取出第\(i\)位及以下的限制\(x\),滿足題意的方案數
那么對限制的第\(i\)位,我們把\(S\)中第\(i\)位是\(1\)和是\(0\)的分成兩個集合\(A\)和\(B\)
接下來討論
如果限制的這一位是\(1\)的的話,我們顯然只能在\(A\)和\(B\)中各至多選擇一個,否則異或出來必然存在這一位是\(0\)的
那么此時我們就滿足了\(x\)第\(i\)位的限制
於是這一個我們可以考慮對\(A\)建一棵trie,對\(B\)中的每一個數在trie數上統計滿足\(x\)的后\(i-1\)位的方案數,這一部分總復雜度是\(O(n\log a_i)\)
如果限制的這一位是\(0\)的的話,我們從兩個集合中各拉出來一個數異或起來顯然是\(>=x\)的,所以只需要考慮A和B內部的選擇,我們發現這變成了兩個子問題\(solve(A,i-1)\) \(solve(B,i-1)\)的答案的積
我們發現總共分治\(\log a_i\)層,每層總個數不超過\(n\),所以這部分總復雜度也是\(O(n\log a_i)\)的
總復雜度\(O(n\log a_i)\)
T4
思路:容斥
我們考慮把每個\(k\)的答案分開來計算
首先我們發現,對於操作次數為\(k\)的答案是所有最長上升子串長度至少是\(n-k\)的排列的個數
這一點不難證明,此處略去
我們考慮用總排列數減去所有不含長度至少是\(n-k\)的上升子串的方案數
這一部分我們可以考慮容斥,用總方案數減去欽定了一個長度是\(n-k\)的上升子串的方案,再加上兩個\(n-k\)的上升子串的方案數....
但是我們注意到多個重疊的上升子串是需要合並的
於是我們就可以把長度為\(x\)的上升子串的所有能夠構成他的方案的容斥系數求出來,這里我們認為不屬於任意一個上升子串的單個數,其長度是\(1\)
然后這里可以dp,大概就是
\(f[1]=1\ \ \ \ \ f[n-k]=-1\)
\(f[i]=-\sum_{j=1}^{n-k-1}f[i-j]\)
得到這個以后就可以計算了
我們設\(g[i]\)表示總長度是i的所有排列方案的容斥系數總和
那么\(g[i]=\sum_{j=1}^{i}g[i-j]f[j]\)
但是我們還要給每一個上升子串分配他是哪些數怎么搞
我們發現分配方案恰為\(\frac{n!}{\prod a_i!}\)其中\(a_i\)是我們欽定的每一個上升子串的長度
\(n!\)可以提出來,\(a_i!\)這個東西是可以揉到容斥系數里的,即對於dp出來的\(f_i\)都乘上\(\frac{1}{i!}\)
單次dp復雜度是\(O(n^2)\),總復雜度是\(O(n^3)\)
過不了怎么辦?
我們把dp出來的\(f[i]\)打出來,發現一個驚人的事情!
對於\(i=(n-k)*t\),\(f[i]\)是\(-1\)
對於\(i=(n-k)*t+1\),\(f[i]\)是\(1\)
其他的都是\(0\)
其實這一點非常好證,此處略去
於是我們的轉移只有\(n/(n-k)\)個
單次dp復雜度降至\(O(\frac{n^2}{n-k})\),總復雜度降至\(O(n^2\ln n)\)