G44 圆排列 错位排列
视频链接:https://www.bilibili.com/video/BV1CA411o7JF/
#include<iostream> using namespace std; const int N = 21; long long D[N]; int main(){ int n; scanf("%d", &n); D[1]=0,D[2]=1; for(int i=3; i<N; i++) D[i]=(i-1)*(D[i-1]+D[i-2]); printf("%lld\n",D[n]); return 0; }
#include<iostream> using namespace std; const int N = 21; long long C[N][N],D[N]; void init(){ for(int i=0; i<N; i++) C[i][0]=1; for(int i=1; i<N; i++) for(int j=1; j<=i; j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; D[1]=0,D[2]=1; for(int i=3; i<N; i++) D[i]=(i-1)*(D[i-1]+D[i-2]); } int main(){ init(); int T, n, m; scanf("%d", &T); while(T--){ scanf("%d%d", &n,&m); printf("%lld\n",C[n][m]*D[m]); } return 0; }