我突然想起来,你说这道题是不是一个错排呀,让我康康
没错就是错排加上组合数公式;
好的,打表解决一切;
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=520;
long long d[maxn];
//long long fun(int a,int b)
//{
// long long res1=1,res2=1;
// for(int i=b;i>=1;i--)
// res1*=i;
// for(int i=a;i>=a-b+1;i--)
// res2*=i;
// long long ans=res2/res1;
// return ans;
//}
int main()
{
d[1]=0;
d[2]=1;
for(int i=3;i<=maxn;i++)
d[i]=(i-1)*(d[i-1]+d[i-2]);
int t,n,m;
scanf("%d",&t);
while(t--)
{
long long ans=1;
scanf("%d%d",&n,&m);
for(int i=n;i>=n-m+1;i--)
ans*=i;
for(int i=1;i<=m;i++)
ans/=i;
printf("%lld\n",ans*d[m]);
}
return 0;
}
呵呵别坑的惨的一批wa了十几次,公式没问题,后来发现中间数据溢出了,哈哈,那怎么办呢,有时候暴力真的不能解决所有问题的样子,哎,看了别的大佬的优化我只能默默的记心头,然后还有一个很坑的地方就是数据类型,longlong啊,一定要用longlong