HNOI2011 卡農 題解

2022-09-18 13:30:15 字數 883 閱讀 7234

真·狀壓dp

啥比題面

等價於在 \(s=\\) 中選 \(m\) 個數(無序),滿足:

問方案數,對 \(10^8+7\) 取模 .

這個無序是個假的,最後除掉 \(m!\) 就完了,,,

設 \(dp_\) 表示選了 \(k\) 個數的方案數 .

考慮容斥,顯然如果前 \(k-1\) 個數都確定了,則第 \(k\) 個數也就確定了(第 \(k\) 個數為前面數的異或和)

於是直接大力選,方案數為 \(a_^\) .

然後可能違反限制,我們算一下:

\[dp_(k-1)(2^n-1-(k-1))

\]減掉,於是得到最終轉移方程 .

\[\large dp_k = a_^ - dp_ - dp_(k-1)(2^n-1-(k-1))

\]因為 \(a\) 的底是不變的,所以可以預處理下降冪,然後可以先算出 \(2^n-1\) 然後轉移的時候直接用 .

這樣就可以 \(o(1)\) 轉移了,總複雜度 \(o(\log n+m)\)(迫真,\(\log n\) 是快速冪友情贈送) .

using namespace std;

typedef long long ll;

const int n = 1e6+500, p = 1e8+7;

int n, m;

ll dpow[n], n2;

ll dp[n];

ll qpow(ll a, ll n)

return ans;

}void init()

inline ll inv(const ll& x)

inline ll fac(const int& x)

int main()

HNOI 2011 卡農 題解

題目傳送門 題目大意 有乙個集合 你要選出他的若干個子集組成長度為 n nn 的序列,滿足 不存在相同的子集 不能有空集 每種元素在所有子集 現次數總數為偶數。問有多少個不同的序列 兩個序列相同當且僅當 a aa 可以重新排列得到 bbb。由於序列中每個子集不同,所以可以先不考慮序列相同的問題,最後...

HNOI2011 數學作業

hnoi2011 數學作業 小 c 數學成績優異,於是老師給小 c 留了一道非常難的數學作業題 給定正整數 n 和 m 要求計算concatenate 1.n mod m 的值,其中 concatenate 1.n 是將所有正整數 1,2,n順序連線起來得到的數。例如,n 13,concatenat...

HNOI2011 數學作業

我又對著跑出正解的程式調了好久 怕不是眼瞎了 這就是個分段矩陣,我們很容易就得到了遞推式 f i f i 1 10 k i 其中 k log i 於是就是分段矩陣 矩陣 之後就是 了,沒有加快速乘wa了好久 cpp include include include define re register...