給定乙個排列\(p_,p_,\dots,p_\),規定操作是選擇兩個數進行交換,設將排列變成\(1,2,/dots,n\)需要最少次數需要m次交換,求出有多少次不同的操作達到公升序排列的目標,對答案模\(10^ + 9\)
\(1\leq n\leq 10^\)
對於乙個排列\(p_,p_,\dots,p_\),每個\(i\) 向 \(p_\)連一條邊,那麼可以得到\(n\)個點的無\(n\)條邊的圖,
並且圖是由若干邊組成。
引理:將乙個長度為\(n\)的環邊成\(n\)個自環,最少需要\(n-1\)次交換。
其中長度為n的環必然滿足這樣\(2,3,/\dots,n,1\) 的大小關係
引理的簡單證明:
長度為\(2\)的環, 顯然需要2次交換,
假設\(\forall k長度為\(k\)的環交換變成公升序的最少交換都是\(k-1\)
長度為n的環\(v_ \rightarrow v_ \rightarrow \cdots \rightarrow v_ \rightarrow v_\)
交換\(v_\)和\(v_\)
\((i的出邊即\(v_\)和\(v_\)後,環被拆成了
\[v_\rightarrow v_ \rightarrow \dots \rightarrow v_ \rightarrow v_\rightarrow v_
\]\[v_ \rightarrow v_ \rightarrow \dots\rightarrow v_ \rightarrow v_ \rightarrow v_ \rightarrow \dots \rightarrow v_ \rightarrow v_
\]這兩個環,兩個環的長度分別是\(j-i\)和\(n-(j-i)\),
兩個環的最少交換次數是\((j-i-1)\)和\(n-(j-i)-1\) 加上剛才的一次交換即\(n-1\)
數學歸納法得證
用\(f_\)表示將長度為\(n\)的環變成\(n\)自環的不同運算元量,在變成自環的過程中
可以將該環拆成長度為\(x\)和\(y\)的兩個不同的環,\(x+y=n\),
設\(g(x,y)\)表示有多少種交換方法可以把長度為\(n\)的環拆分成長度為\(x,y\)的兩個環
那麼可以得到
\[g(x, y)\left\\frac & n \text \wedge x=y \\ n & \text \end\right.
\]\(x\)和\(y\)變成自環的不同的交換個數分別為\(f_\),\(f_\),交換次數分別是\(x-1\),\(y-1\),兩個分別是獨立的所以只需要計算交錯排列的,
\(x\)和\(y\)內部的交換在\(f_\)和\(f_\)遞迴中\(g\)所統計所以只需要執行\(x\)和\(y\)的先後排列即可。
假設排列\(p_,p_,\dots,p_\)中有長度為\(l_,l_,\dots,l_\)的\(k\)個環組成,\(l_+l_+\dots+l_=n\),那麼最終的答案就是
\[ans=\left(\prod_^ f\left[l_\right]\right) *\left(\frac^\left(l_-1\right) !}\right)
\]\(10^ + 9\)是質數快速冪處理逆元即可,求\(f\)是\(o(n)\)的,複雜度是\(o(n \times k)\)
打表前10項得到
\[1\quad 1 \quad 3 \quad 16 \quad 125 \quad 1296 \quad 16807 \quad 262144 \quad 4782969 \quad 100000000
\]帶入oeis中可以得到通項公式為
\[f_=n^
\]這樣可以將求\(f\)複雜度降到\(o(logn)\)
#include#define ll long long
using namespace std;
const int n=1e5+10,mod=1e9+9;
ll jc[n];
bool v[n];
ll p[n];
ll quick_pow(ll a,ll b)
return res;
}int main()
int t;
cin>>t;
while(t--)
ans = ans * jc[n - cnt] % mod;
printf("%lld\n",ans);
}return 0;
}
容斥原理 數論
兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...
容斥原理,反演
大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...
關於容斥原理
容斥原理大概是這樣的,以長方體體積並為例,我們需要用容斥原理容斥出若干個長方體體積的並.首先,我們將每個長方體標號為1 n,那麼這些長方體的取捨顯然可以表示為乙個二進位制的數字s.設f s 表示長方體取捨狀態為s時,長方體的體積並,於是我們可以知道f 111111 有n個1 就是我們最終的所求.好,...