hdu 2049 不容易系列之(4)——考新郎

来源:互联网 发布:h3c认证网络排错专家 编辑:程序博客网 时间:2024/05/16 12:31

 首先,从n个里面选出m个(不排序),一共有C(n,m)个,

即:    n!/(n-m)!/m!;

然后在这选出的m个数中需要用到错排,

详见http://blog.csdn.net/xzf19930910/article/details/9875487

即:f[i]=(i-1)*(f[i-1]+f[i-2]);

代码如下:

#include <iostream>#include <cstdio>#include<cstring>#include <cmath>using namespace std;int main(){    int n,m,i,j,c;    long long f[22],s[22];  f[0]=1;  for(i=1;i<22;i++)     f[i]=f[i-1]*i;   s[1]=0;   s[2]=1;  for(i=3;i<22;i++)    s[i]=(i-1)*(s[i-1]+s[i-2]);   cin>>c; while(c--) {     cin>>n>>m;    cout<<s[m]*(f[n]/f[m]/f[n-m])<<endl;; }    return 0;}