BZOJ4517 遞推 錯排 排列計數 題解

2021-08-04 14:38:44 字數 1131 閱讀 7646

description

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

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

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

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

input

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

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

t=500000,n≤1000000,m≤1000000

output

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

sample input

1 01 1

5 2100 50

10000 5000

sample output

60695423

hint

source

鳴謝menci上傳

序列裡任意m個數穩定都是等價的,考慮不穩定的那幾個就是裸錯排

所以錯排*組合數即可 f[n-m]*c(m,n)

設f[i]表示i個人的錯排方案數

f[0]=1,f[1]=0

f[i+1]=(f[i]+f[i-1])*i

考慮第i+1個人怎麼換,可以和前i個人裡的乙個互換,這是f[i]*i。或者拿第j個人的,並且第j個人不拿i的,在不考慮i的情況下第j個人不拿i與第j個人不拿j是等價的,所以就是f[i-1]*i。

#include 

#include

#include

#define ll long long

const int maxn = 1000010;

const int mod = 1000000007;

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

int n,m,t;

template inline void read(t &x)

while(ch >= '0' && ch <= '9')

x*= flag;

}inline void init()

inline ll solve(int n, int

m) int main()

排列計數(bzoj 4517)

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

bzoj4517 錯排 組合)

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

BZOJ4517 排列計數(錯排公式)

從開始看這題到現在,已經過了30多把lol的時間了。話說今天又有一道排列計數的題讓我懵逼。題面題意 問有多少長為n的排列a,恰好有m個位置存在a i i。我們列舉這n m個a i i位置,有cm n 種情況。對於x個數的排列,不存在a i i的方案數設為f x 經過簡單的打表可以發現f i f i ...