題目鏈結;
給定乙個 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時,表示輸入終止,且該行不作處理。輸出格式 每組資料輸出乙...