这个道题就是求N中有多少中M个数的错排。
因此先找到N个新郎中M个错一共有几种,显然是CMN=N!/(M!*(N-M)!)。即CMN=N!/M!/(N-M)!。
然后在求出M个数的错排个数,递推关系:f[n]=(n-1)*(f[n-1]+f[n-2])
#include <cstdio> long long int m[30]; long long int C(int n, int m) { long long int sum = 1, j = 1; for(int i = n; i >= n - m + 1; -- i) { sum = sum * i / j; j ++; } return sum; } long long int f(int n) { m[2] = 1; m[3] = 2; for(int i = 4; i <= n; ++ i) { m[i] = (i - 1) * (m[i - 1] + m[i - 2]); } return m[n]; } int main() { int c, n, m; scanf("%d", &c); while(c --) { scanf("%d %d", &n, &m); printf("%lld ", C(n, m) * f(m)); } return 0; }