acwing212 計數交換 多重集排列數

2021-09-26 10:56:39 字數 1255 閱讀 5061

題目鏈結

給定乙個 1~n 的排列 p1,p2,…,pn,可進行若干次操作,每次選擇兩個整數 x,y,交換 px,py。

設把 p1,p2,…,pn 變成單調遞增的排列 1,2,…,n 至少需要 m 次交換。

求有多少種操作方法可以只用 m 次交換達到上述目標。

因為結果可能很大,你只需要輸出結果對 10^9+9 取模之後的值。

例如排列 2,3,1 至少需要2次交換才能變為 1,2,3。操作方法共有3種,分別是:

方法一:先交換數字2,3,變成 3,2,1,再交換數字3,1,變成 1,2,3。

方法二:先交換數字2,1,變成 1,3,2,再交換數字3,2,變成 1,2,3。

方法三:先交換數字3,1,變成 2,1,3,再交換數字2,1,變成 1,2,3。

輸入格式

第一行包含整數t,表示一共有t組測試用例。

每個測試用例前都會有乙個空行。

每個測試用例包含兩行,第一行包含整數n。

第二行包含n個整數,表示序列p1,p2,…,pn。

輸出格式

每個測試用例輸出乙個結果,每個結果佔一行。

資料範圍

1≤n≤10^5

輸入樣例:

3

32 3 1

42 1 4 3

21 2

輸出樣例:

3

21

參考李煜東大佬的演算法競賽高階指南

#includeusing namespace std;

typedef long long ll;

const int maxn=1e5+5;

const int mod=1e9+9;

ll fac[maxn],ni[maxn],f[maxn];

int n;

int a[maxn];

bool flag[maxn];

ll ksm(ll a,ll b)

return ans;

}void init()

int main()

ans=ans*fac[n-cnt]%mod;

printf("%lld\n",ans);

}return 0;

}

AcWing 1134 最短路計數

題目描述 給出乙個 n 個頂點 m 條邊的無向無權圖,頂點編號為 1 到 n。問從頂點 1 開始,到其他每個點的最短路有幾條。輸入格式 第一行包含 2 個正整數 n,m,為圖的頂點數與邊數。接下來 m 行,每行兩個正整數 x,y,表示有一條頂點 x 連向頂點 y 的邊,請注意可能有自環與重邊。輸出格...

AcWing 338 計數問題

acwing 338.計數問題 給定兩個整數 a 和 b,求 a 和 b 之間的所有數字中0 9的出現次數。例如,a 1024,b 1032,則 a 和 b 之間共有9個數如下 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出現10次,1 出現1...

ACWing 338 計數問題

給定兩個正整數a aa和b bb,求 a,b a,b a,b 之間所有數字中0 9 0 sim 9 0 9出現的次數。前導0 00不許出現。輸入格式 輸入包含多組測試資料。每組測試資料佔一行,包含兩個整數a aa和b bb。當讀入一行為0 0時,表示輸入終止,且該行不作處理。輸出格式 每組資料輸出乙...