http://acm.hdu.edu.cn/showproblem.php?pid=2049
这是一道错排题,可是比赤裸裸的要多一点东西。因为m个人错排,可是不知道是哪m个错排,所以要用到高中排列组合,即调用函数的公式:
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
__int64 mm(int x,int y)
{
__int64 sum=1;
for(int i=x;i>=x-y+1;--i)
sum*=i;
for(int j=y;j>=2;--j)
sum/=j;
return sum;
}
int main()
{
__int64 a[22];
int t,n,m;
a[1]=0;a[2]=1;
for(int i=3;i<=20;++i)
a[i]=(i-1)*(a[i-1]+a[i-2]);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("%I64d\n",mm(n,m)*a[m]);
}
return 0;
}