2 2 2 3 2
1 3
遇到的困难和思路:
这道题和hdu的2048相似,只需要将排序好的和错排的组合一下就可以了。基本上牵扯到的是排列组合。
还有,要注意,14!就已经超出了int的范围,这个时候要用longlong。
给出代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<string> using namespace std; int n,m; long long a[30]; int main(){ a[1] = 0,a[2] = 1; for(int i = 3;i < 25;i++){ a[i] = (i-1)*(a[i-1] + a[i-2]); } int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); long long x = 1,y = 1,z = 1; for(int i = n;i >= n-m+1;i--)x*=i; for(int i = 1;i <= m;i++)y*=i; z = x / y; printf("%I64d\n",a[m]*z); } return 0; }