问题可以简化为M-K个人全部错排的问题,在M-K个人中错排可以利用递推公式:
F(N)=(N-1)*(F(N-1)+F(N-2))
最终求解公式:G[N]=F[M-K]*C(N,K)
#include<iostream> using namespace std; int M; int N; __int64 a[21]; __int64 g[21]; int main() { int c; cin>>c; g[0]=1; for(int i=1;i<=20;i++) g[i]=i*g[i-1]; a[1]=0; a[2]=1; for(int i=3;i<=20;i++) { a[i]=(i-1)*(a[i-1]+a[i-2]); } while(c--) { cin>>N>>M; __int64 ans=(g[N]/(g[M]*g[N-M]))*a[M]; cout<<ans<<endl; } return 0; }