hdu 2049
假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1<M<=N<=20)。
Output
对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
Sample Input
|
思路:错位排列,注意一定要用long long
#include <iostream>
#include <cstdio>
using namespace std;
long long c(int n,int m)
{
int ans=1;
for(int i=1;i<=m;i++)
{
ans=ans*(n-m+i)/i;
}
return ans;
}
int main()
{
int cases,m,n,i;
cin>>cases;
long long f[22]={0,0,1};
for(i=3;i<22;i++)//错排
f[i]=(i-1)*(f[i-1]+f[i-2]);
while(cases--)
{
scanf("%d%d",&n,&m);
// ans=C(n,n-m)*f[m]错排
printf("%I64d\n",c(n,n-m)*f[m]);
}
return 0;
}