HDOJ 2948 错排公式

将第 n 个数放在 第 k 个位置上,共 n-1 种;

如果第 k 个数放在第 n  个位置,共有 f[n-2] 种,否则由于第 k 个数不能放在第 n 个位置,剩余的数相当于 n-1 个数时的子问题,即f[n-1];

# include <stdio.h>

long long int f[21], fact[21];

void prepare(void)
{
    int i;
    
    fact[1] = 1;
    for (i = 2; i <= 20; ++i)
        fact[i] = i * fact[i-1];
    
    f[1] = 0;
    f[2] = 1;
    for (i = 3; i <= 20; ++i)
        f[i] = (i-1) * (f[i-1]+f[i-2]);
}

int main()
{
    int T, n;
    
    prepare();
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d", &n);
        printf("%.2lf%%\n", f[n]/fact[n]*100.0); 
    }    
    
    return 0;
}

//

原文地址:https://www.cnblogs.com/JMDWQ/p/2580592.html