SDOI2016 排列計數

2022-06-18 16:06:11 字數 758 閱讀 8729

在n個數中選m個,使得m個數中\(a[i]=i\)的方案數可以表示為\(c_^\)。而剩下的n-m個數必須滿足\(a[i]i\),那麼這個方案數可以表示為\(d_\),即錯排數。那麼答案就是:

\[c_^*d_=}*d_

\]其中的錯排數可以通過遞推公式計算:\(d_i=(d_+d_)*(i-1)\)。不過注意到題目要求我們取模,而分母位置有階乘,所以我們還需要計算階乘的逆元:

\[x!^=(\prod_^i)^=\prod_^i^

\]因此可以線性計算。

時間複雜度為\(o(n+t)\)

#include#include#include#define maxn 1000010

#define mod 1000000007

using namespace std;

inline int read()

while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}long long inv[maxn],mul[maxn],mul_inv[maxn],d[maxn];

int t,n,m;

inline void prework()

d[0]=1ll,d[1]=0ll,d[2]=1ll;

for(register int i=3;i<=n;i++)

}int main()

return 0;

}

SDOI 2016 排列計數

題目鏈結 演算法 有m個數在原來的位置上,說明有 n m 個數不再原來的位置上 那麼,我們可以選出 n m 個數,使這 n m 個數都不在原來的位置上,再讓剩下的m個數都在原來的位置上 錯位排列遞推公式 f 1 0 f 2 1 f n n 1 f n 1 f n 2 n 2 因此,答案為c n,n ...

SDOI2016 排列計數

嘟嘟嘟 從今天開始搞一搞組合計數!先學乙個錯排公式。所謂的錯排就是乙個排列,滿足對於任意的 i 有 a i neq i 這東西是可以遞推求的。令 d i 表示長度為 n 的排列的錯排數。我們假設 d n 1 已經求出來,現在考慮第 n 個。首先第乙個肯定要和其中任意第 i 個 1 leqslant ...

SDOI2016 排列計數

求有多少種長度為 n 的序列 a,滿足以下條件 1 n 這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10 9 7 取模。第一行乙個數 t,表示有 t 組資料。接下來 t 行,每行兩個整數 n...