眾所周知卡農是一種複調**的寫作技法,小余在聽卡農**時靈感大發,發明了一種新的**譜寫規則。
他將聲音分成 \(n\) 個音階,並將**分成若干個片段。**的每個片段都是由 1 到 \(n\) 個音階構成的和聲,即從 \(n\) 個音階中挑選若干個音階同時演奏出來。
為了強調與卡農的不同,他規定任意兩個片段所包含的音階集合都不同。同時為了保持**的規律性,他還規定在一段**中每個音階被奏響的次數為偶數。
現在的問題是:小余想知道包含 \(m\) 個片段的**一共有多少種。
兩段** \(a\) 和 \(b\) 同種當且僅當將 \(a\) 的片段重新排列後可以得到 \(b\)。例如:假設 \(a\) 為 \(\,\\}\),\(b\) 為 \(\,\\}\),那麼 \(a\) 與 \(b\) 就是同種**。
答案對 \(10^8+7\) 取模。
\(n,m\leq 10^6\)。
理一下題目內容發現我們需要求出滿足以下幾個條件的序列數量:
不難發現我們不需要考慮兩個序列「本質相同」,因為最後直接除以 \(m!\) 即可。
考慮 dp。設 \(f_i\) 表示序列前 \(i\) 個元素有多少種方案是合法的。那麼考慮容斥:
無視所有條件,當我們確定了前 \(i-1\) 個元素(保證兩兩不同)時,我們一定可以唯一確定第 \(i\) 個元素,因為我們轉化成了有標號的,所以方案數就是 \(\binomi!\)。
考慮減去重複的情況,假設第 \(i\) 個集合與第 \(j(j個集合完全一致,那麼同時刪去這兩個元素能得到乙個長度為 \(i-2\) 的合法序列。除去這 \(i-2\) 個元素以外,\(i,j\) 有 \(2^n-1-(i-2)\) 種可能,\(j\) 可以被放在序列 \(i-1\) 個空隙之間,所以重複的數量是 \((i-1)(2^n-1-(i+1))f_\)
還要減去前 \(i-1\) 個元素已經保證了每乙個數字各出現偶數次,這樣第 \(i\) 個元素唯一確定是空集,不合法。方案數顯然是 \(f_\)。
所以我們得到
\[f_i=\binomi!-(i-1)(2^n-1-(i+1))f_-f_
\]組合數遞推,其他預處理即可。時間複雜度 \(o(n+m)\)。
#include using namespace std;
typedef long long ll;
const int n=1000010,mod=1e8+7;
int n,m;
ll power,f[n],g[n],fac[n],inv[n];
ll fpow(ll x,ll k)
int main()
printf("%lld",(f[m]*fpow(fac[m],mod-2)%mod+mod)%mod);
return 0;
}
洛谷P5049 洛谷P5022 題解 旅行
原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...
洛谷練習P2279 P1346
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...
洛谷 P1396 營救
題目描述 咚咚咚 查水表!原來是查水表來了,現在 找這麼熱心上門的查表員啊!小明感動的熱淚盈眶,開起了門 媽媽下班回家,街坊鄰居說小明被一群陌生人強行押上了警車!媽媽豐富的經驗告訴她小明被帶到了t區,而自己在s區。該市有m條大道連線n個區,一條大道將兩個區相連線,每個大道有乙個擁擠度。小明的媽媽雖然...