求有多少種長度為 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 0
1 15 2
100 50
10000 500001
20578028887
60695423
先列舉有哪些數字滿足ai=i,那麼就變成了經典的錯排問題。
錯排問題的遞推式f[n]=(f[n-1]+f[n-2])*(n-1)。
我們考慮這n個人中編號最小的人i,設他站到了j號位置。
1.如果j號人站到了i號位置,問題轉化成乙個n-2的錯排問題。
2.如果j號人沒有站到i號位置,那麼除去i號人所有人都站錯了,問題轉化成乙個n-1的錯排問題。
預處理一下階乘即逆元即可。
#include#include#include#include#include#define rep(i,s,t) for(int i=s;i<=t;i++)#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int buffersize=1<<16;
char buffer[buffersize],*head,*tail;
inline char getchar()
return *head++;
}inline int read()
typedef long long ll;
const int maxn=1000010;
const int mod=1000000007;
int xp[maxn],inv[maxn],f[maxn];
int c(int n,int m)
void init(int n)
int a[maxn],b[maxn];
int main()
return 0;
}
bzoj4517 sdoi2016 排列計數 錯排
題目大意 給定n,m。求排列個數,排列滿足 1 是全排列的一種。2,有且僅有m個數a i i。嗯,今天 第一次 聽說了個錯排這個東西。誒。不過開心,smz妹子給我講噠 錯排就是求n的排列個數,排列滿足不存在a i i。可以遞推來完成。f i i 1 f i 1 f i 2 證明 第i個元素可以選擇和...
bzoj 4517 Sdoi2016 排列計數
求有多少種長度為 n 的序列 a,滿足以下條件 1 n 這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10 9 7 取模。第一行乙個數 t,表示有 t 組資料。接下來 t 行,每行兩個整數 n...
BZOJ 4517 Sdoi2016 排列計數
de scri ptio n 求有多少種長度為 n 的序列 a,滿足以下條件 1 n這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i 則稱 i是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 109 7取模。inp ut 第一行乙個數 t 表示有 t組資料...