Description
求有多少种长度为
n
的序列
1
~
若第
满足条件的序列可能很多,序列数对
Input
第一行一个数
T
,表示有
接下来
T
行,每行两个整数
T=500000,n≤1000000,m≤1000000
Output
输出 T 行,每行一个数,表示求出的序列数
n
个数中选出
错排问题的公式(递推式)
f[n]=n∗f[n−1]+(−1)n
f[0]=1
因为模数是质数,所以组合数分母的逆元可以暴力算
#include<cstdio>
#define mod 1000000007
#define N 1000005
int T,t[N],f[N],n,m;
inline int time(int a,int b)
{
int ans=1;
while (b)
{
if (b&1) ans=1LL*ans*a % mod;
a=1LL*a*a % mod,b>>=1;
}
return ans;
}
int main()
{
scanf("%d",&T);t[0]=f[0]=1;
for (int i=1;i<1000001;i++) t[i]=1LL*t[i-1]*i % mod,f[i]=(1LL*f[i-1]*i+((i&1)?-1:1)) % mod;
while (T--)
{
scanf("%d%d",&n,&m);
printf("%d\n",(1LL*f[n-m]*t[n] % mod)*time(1LL*t[m]*t[n-m] % mod,mod-2) % mod);
}
}