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;

}

//

你可能感兴趣的:(OJ)