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