容斥原理 Counting swaps

2022-07-05 18:42:12 字數 2193 閱讀 4532

給定乙個排列\(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 就是我們最終的所求.好,...