2049

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2049

思路:

正难则反。可以反着来求:选对的情况。利用排列组合公式:

然后再求剩下的都选错有多少情况。递推寻找规律:

a[i]=(a[i-2]+a[i-1])*(i-1)

code:

#include <iostream>
using namespace std;
long long     Fac(int n){
long long     ans=1;
for(int i=1;i<=n;i++)
    ans=ans*i;
return ans;
}
int main()
{
    int C;
    cin>>C;
    long long a[21];
    a[1]=0;
    a[2]=1;
    for(int i=3;i<=20;i++)
        a[i]=(a[i-2]+a[i-1])*(i-1);
    while(C--){
        int M,N;
        cin>>M>>N;
        cout<<Fac(M)/(Fac(M-N)*Fac(N))*a[N]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/CheeseIce/p/9738694.html