此题跟2048很相似,都是错排的问题,只不过加入组合数的知识罢了。
代码如下:`
#include<cstdio>
#include<iostream>
using namespace std;
long long array[25];
int main()
{
long long n,m;
int i,kase;
long long a,b;
for(i=2;i<=24;i++)
{
if(i==2) array[i]=1;
else if(i==3) array[i]=2;
else array[i]=(i-1)*(array[i-1]+array[i-2]);
}
scanf("%d",&kase);
while(kase--)
{
scanf("%lld %lld",&n,&m);
a=b=1;
for(i=n;i>=n-m+1;i--)
a=a*i;
for(i=m;i>=1;i--)
b=b*i;
a=a/b;
//printf("%llf\n",a);
// cout<<array[m]*a<<endl;
printf("%lld\n",array[m]*a);
}
return 0;
}
由于电脑一时计算错误,导致我误以为数据越界,就改了很多次,也WA了很多次,而事实上这道题只要用long long 数据类型就可以了。