题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049
思想基础:全部元素错排参见http://blog.youkuaiyun.com/liuweiyuxiang/article/details/51020148
本题为对部分元素进行错排:首先从n个元素中选取m个为C(n,m)中情况,然后对选出的m个元素进行错排
#include <iostream>
#include <cstring>
#include <cstdio>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
int n;
int m;
int c;
__int64 sum[21];
__int64 f[21];
sum[0] = 1;
sum[1] = 1;
f[0] = 1;
f[1] = 0;
for(int i = 2;i < 21;i++){
sum[i] = sum[i-1] * i;
//cout<<sum[i]<<endl;
f[i] = (i-1)*(f[i-1] + f[i-2]);
//cout<<f[i]<<endl;
}
cin>>c;
for(int j = 0;j < c;j++){
cin>>n;
cin>>m;
//cout<<f[m] * sum[n] / (sum[m] *sum[n-m])<<endl;
//cout<<sum[n] / sum[m] / sum[n-m]<<endl;
cout<<f[m] * (sum[n] / sum[m] /sum[n-m])<<endl;
}
return 0;
}