不容易系列之(4)——考新郎

这个道题就是求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\n", C(n, m) * f(m));
}
return 0;
}

浙公网安备 33010602011771号