错排公式的应用。因为n个新郎中有m个“错排”了,所以先用C(n,m)求出从n个新郎中挑m个出来的方案数,再乘以错排数即可。
关于错排公式,可看这里:
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#define INF 0x7fffffff
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e6+5;
ll combi[25];
ll d[25];
void make_com(int n)
{
combi[0]=1;
for(int i=1;i<=n;i++)
combi[i]=combi[i-1]*(n-i+1)/i;
}
void make_mistake(int m)
{
d[1]=0,d[2]=1;
for(int i=3;i<=m;i++)
d[i]=(i-1)*(d[i-1]+d[i-2]);
}
int main()
{
int t;
cin>>t;
while(t--)
{
mst(combi,0);mst(d,0);
int n,m;
cin>>n>>m;
make_com(n);make_mistake(m);
ll ans=combi[m]*d[m];
cout<<ans<<endl;
}
return 0;
}