原题链接:click here
题目大意:有n个新郎,其中有m个新郎找错了新娘,求发生这种情况有多少种可能。
解题思路:(1)从n个新郎里选择m个,总共有C(n,m)种选法。
(2)让m个新郎去错排,利用错排公式求出错排数a[m]。
(3)根据分步乘法原理可知,这种情况发生共有C(n,m)*a[m]种可能。
代码如下:
#include<stdio.h> int main() { int t,n,m,i; _int64 x,y,a[22]={0,0,1,2}; for(i=4;i<=20;i++) { a[i]=(i-1)*(a[i-1]+a[i-2]); } scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(x=1,i=n-m+1;i<=n;i++) x=x*i; for(y=1,i=1;i<=m;i++) y=y*i; printf("%I64d\n",x/y*a[m]); } return 0; }