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;
}

 

posted @ 2018-10-02 22:22  CheeseIce  阅读(168)  评论(0)    收藏  举报