#include<stdio.h>
#include<string.h>
long long a[25]={0,0,1},c[25][25];
int main()
{
long long i,j;
for(i=3;i<=20;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]); // 打的错排表
for(i=1;i<=20;i++)
{
c[i][0]=c[i][i]=1;
for(j=1;j<i;j++) //打一个20以内排列组合的表
c[i][j]=(c[i-1][j-1]+c[i-1][j]);
}
long long n,m;
while(~scanf("%lld%lld",&n,&m))
{
printf("%lld\n",c[n][n-m]*a[m]);
}
}
这道题需要注意一个问题就是,固定位置的确定后,有个隐藏条件是原来位置的都要改变其位置,第一次写的时候没有想到。