将第 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; }
//