P4071 SDOI2016 排列計數

2022-03-04 03:29:28 字數 2292 閱讀 1259

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

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

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

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

輸入格式:

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

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

輸出格式:

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

輸入樣例#1:

5

1 01 1

5 2100 50

10000 5000

輸出樣例#1:

0120

578028887

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,表示有 ...