SDOI2016 排列計數 組合數學

2022-04-30 07:30:09 字數 1675 閱讀 3183

求有多少種長度為 n 的序列 a,滿足以下條件:

1 ~ n 這 n 個數在序列中各出現了一次

若第 i 個數 a[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的

滿足條件的序列可能很多,序列數對 10^9+7109+7 取模。

輸入格式:

第一行乙個數 t,表示有 t 組資料。

接下來 t 行,每行兩個整數 n、m。

輸出格式:

輸出 t 行,每行乙個數,表示求出的序列數

輸入樣例#1:

51 0

1 15 2

100 50

10000 5000

輸出樣例#1:01

20578028887

60695423

測試點 1 ~ 3: \(t = 1000,n \leq 8,m \leq 8;\)

測試點 4 ~ 6: \(t = 1000,n \leq 12,m \leq 12;\)

測試點 7 ~ 9: \(t = 1000,n \leq 100,m \leq 100;\)

測試點 10 ~ 12:\(t = 1000,n \leq 1000,m \leq 1000;\)

測試點 13 ~ 14:\(t = 500000,n \leq 1000,m \leq 1000;\)

測試點 15 ~ 20:\(t = 500000,n \leq 1000000,m \leq 1000000。\)

錯排公式/組合計數裸題

\(ans=c_^\times d_\),其中\(d_\)為共i個元素的錯排方案數(錯排指元素i不在下標為i的位置上)

然後因為要取模,費馬小定理求一下逆元

在這裡擺一下組合及錯排的公式

\[c_^=\frac}

\]\[d_=(n-1)\times(d_+d_)

\]其實錯排還有乙個通項公式,但是由於時間複雜度太高,所以預處理不太常用,但在這裡還是擺一下

\[d_=n!(1-\frac+\frac-\frac+...+(-1)^n\frac)

\]

#include#define min(a,b) (a)<(b)?(a):(b)

#define max(a,b) (a)>(b)?(a):(b)

#define rg register

#define il inline

#define lol long long

using namespace std;

const int n=1e6+10,mod=1e9+7;

void in(int &ans)

while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();

ans*=f;

}int t,n,m;

lol d[n],ie[n],sum[n];//ie是逆元陣列,inverse element的簡稱

lol qpow(lol a,int x,lol ans=1) return ans;

}il void init()

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...