n对新娘新郎有m个新郎找错了
也就是说有n-m对新娘新郎找对了,然后有m对新娘新郎错排
所以预处理算一下组合数和错排
然后c[n,n-m]*d[m]就行了
题目代码
注意开long long 哦
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long LL; const int maxn=30; LL c[maxn][maxn],d[maxn]; void init(){ for(int i=1;i<maxn;i++){ c[i][i]=1; c[i][0]=1; } for(int i=1;i<maxn;i++) for(int j=i+1;j<maxn;j++){ c[j][i]=c[j-1][i]+c[j-1][i-1]; } d[1]=0,d[2]=1; for(int i=3;i<maxn;i++) d[i]=(i-1)*(d[i-1]+d[i-2]); } int main(){ init(); int n,m,t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); cout<<c[n][n-m]*d[m]<<endl; } return 0; }