求有多少種長度為 n 的序列 a,滿足以下條件:
1 ~ n 這 n 個數在序列中各出現了一次
若第 i 個數 a[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的
滿足條件的序列可能很多,序列數對 10^9+7 取模。
第一行乙個數 t,表示有 t 組資料。
接下來 t 行,每行兩個整數 n、m。
t=500000,n≤1000000,m≤1000000
輸出 t 行,每行乙個數,表示求出的序列數
51 01 1
5 2100 50
10000 5000
0120578028887
60695423
設選定的組合為c(m,n)即總在i位置上的數,那麼其餘(n-m)必須全不在其位置上即求錯排數,
由乘法原理的ans=c(m,n)*f(n-m);
組合數公式c(m,n)=n!/m!(n-m)!,
錯排公式為f(n)=f(n-1)*n+(-1)^n;
預處理出組合數與錯排數,最後用乘法逆元計算即可
#include#include#include
using
namespace
std;
const
int maxn=1000000+10
;const
long
long mod=1e9+7
;long
long
a[maxn],f[maxn];
long
long pow(long
long x,long
long
y)
return ans%mod;
}int
main()
intn,m;
intt;
scanf("%d
",&t);
for (int i=1;i<=t;i++)
return0;
}
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 ...
BZOJ4517 遞推 錯排 排列計數 題解
description 求有多少種長度為 n 的序列 a,滿足以下條件 1 n 這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10 9 7 取模。input 第一行乙個數 t,表示有 t 組資...
排列計數(bzoj 4517)
求有多少種長度為 n 的序列 a,滿足以下條件 1 n 這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10 9 7 取模。第一行乙個數 t,表示有 t 組資料。接下來 t 行,每行兩個整數 n...