题目: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; }