求有多少種長度為 n 的序列 a,滿足以下條件:
1 ~ n 這 n 個數在序列中各出現了一次
若第 i 個數 a[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的
滿足條件的序列可能很多,序列數對 109+7取模。
輸入格式:
第一行乙個數 t,表示有 t 組資料。
接下來 t 行,每行兩個整數 n、m。
輸出格式:
輸出 t 行,每行乙個數,表示求出的序列數
輸入樣例#1:
51 01 1
5 2100 50
10000 5000
輸出樣例#1:
0120578028887
60695423
測試點 1 ~ 3: t=1000,n≤8,m≤8;
測試點 4 ~ 6: t=1000,n≤12,m≤12;
測試點 7 ~ 9: t=1000,n≤100,m≤100;
測試點 10 ~ 12:t=1000,n≤1000,m≤1000;
測試點 13 ~ 14:t=500000,n≤1000,m≤1000;
測試點 15 ~ 20:t=500000,n≤1000000,m≤1000000。
solution:
本題組合數學+錯排公式+線推逆元。
組合數學和逆元就不說了,介紹下錯位排列。
錯位排列,顧名思義就是乙個n元排列,每個元素不能排在自己的位置上的方案數,一般記作$d(n)$。
通項公式:
$$d_n=n!\times(1-\frac+\frac-\frac…\frac)$$
證明:設$s$是由$1,2,…n$構成的所有全排列組成的集合,則$|s|=n!$。
設$a_i$是在$1,2,…n$的所有排列種由第$i$個位置上的元素恰好是$i$的所有排列組成的集合,則有:$|a_i|=(n-1)!$。
同理可得:$|a_i\cap a_j|=(n-2)!$
……一般情況下有:$|a_\cap a_\cap …\cap a_|=(n-k)!$。
因為$d_n$是$s$中不滿足性質$p_1,p_2,…,p_n$的元素個數,所以由容斥原理的:
$d_n=|\overline a_1\cap \overline a_2 …\cap \overline a_n|$
$=n!-c(n,1)*(n-1)!+c(n,2)*(n-2)!-…(-1)^nc(n,n)*0!$
$=n!\times(1-\frac+\frac-…\frac)$
遞推公式:
$$d_n=(n-1)\times(d_+d_)$$
證明:第一步,把第$n$個元素放在乙個位置,比如位置$k$,一共有$n-1$種方法;
第二步,放編號為$k$的元素,這時有兩種情況:(1)把它固定到位置$n$,由於第$n$個元素固定到了位置$k$,剩下$n-2$個元素就有$d_$種方法;(2)
第$k$個元素不能放到位置$n$,而第$n$個元素固定到了位置$k$,於是$n-1$個元素,有$d_$種方法;
綜上得到$d_n = (n-1) \times(d_ + d_)$,特殊地,$d_1=0, d_2=1$。
當然更為常用的是後面的遞推公式,比如本題。
不難發現本題答案為$c(n,m)\times d(n-m)$。
於是我們只要預處理出$10^6$內的階乘取模、階乘的逆元、錯排的方案數就好了。
**:
/*code by 520 -- 9.14
*/#include
#define il inline
#define ll long long
#define re register
#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)
using
namespace
std;
const ll n=1000005,mod=1e9+7
;int
n,m;
ll d[n],c[n],inv[n];
intgi()
il void
pre()
intmain()
return0;
}
題解 P4071 SDOI2016 排列計數
題目鏈結 題目大意 問有多少個 1 n 的排列 a 恰好有 m 個數滿足 a i i 錯排,計數 分析 首先我們選 m 個數有 c n m 種,那麼我們要求答案合法就必須使得剩下的數都不滿足 a i i 也就是我們要求 n m 個數錯排的方案數,假設 d n 表示 n 個數錯排的方案數,我們的答案就...
洛谷 P4071 SDOI2016 排列計數
簡化版題意 1 n n個數字,問滿足m個ai i的排列個數 答案對1e9 7取模 這題就是道裸題,不知道為啥還能是藍的 前置技能一 快速冪 太簡單了不講了 這週和矩陣的知識點一起寫 前置技能二 錯排公式 顧名思義錯排就是ai i的排列個數,高中應該都學過 下面是推理過程 我們設f n 代表n個數的錯...
洛谷 4071 SDOI2016 排列計數
題目描述 求有多少種長度為 n 的序列 a,滿足以下條件 1 n 這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 109 7 10 9 7 109 7 取模。輸入格式 第一行乙個數 t,表示有 ...