题目:
题解:
1A好评?
其实就是组合数学+错排公式啊,错排公式的话:
f[i]=(f[i−1]+f[i−2])∗(i−1)
代码:
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;
const int N=1000000;
const int mod=1e9+7;
LL mul[N+5],f[N+5];
void pre()
{
mul[0]=mul[1]=1;
for (int i=2;i<=N;i++) mul[i]=mul[i-1]*i%mod;
f[0]=1; f[1]=0; f[2]=1;
for (int i=3;i<=N;i++) f[i]=(f[i-1]+f[i-2])*(i-1)%mod;
}
LL ksm(LL a,LL k)
{
LL ans=1;
for (;k;k>>=1,a=a*a%mod)
if (k&1) ans=a*ans%mod;
return ans;
}
LL C(int n,int m)
{
if (m>n) return 0;
return mul[n]*ksm(mul[m],mod-2)%mod*ksm(mul[n-m],mod-2)%mod;
}
int main()
{
int T,i,n,m;
scanf("%d",&T);
pre();
while (T--)
{
scanf("%d%d",&n,&m);
printf("%d\n",(LL)C(n,m)*f[n-m]%mod);
}
}