全错概率 = 错误的情况 / 全部的情况
1. 全部的情况为 n!
2. 对错误的情况进行讨论:
(1) 要保证全错,第一个必然不能拿到自己的名字,所以第一个人有(n-1)中选择。
(2) 第二个人如果拿的是第一个人的名字,就变成了求 (n-2) 人全错的概率,如果拿的不是第一个人的名字,就变成了求 (n-1) 人全错的概率
使用错排公式a[i] = (i - 1) * (a[i - 1] + a[i - 2]);
---------------------
作者:烂草人
#include <cstdio> double memo[40]; double f(int n) { memo[2] = 1; memo[3] = 2; for(int i = 4; i <= n; ++ i) { memo[i] = (i - 1) * (memo[i - 2] + memo[i - 1]); } return memo[n]; } double fun(int n) { double sum = 1; for(int i = 1; i <= n; ++ i) sum *= i; return sum; } int main() { int n, m; double res; scanf("%d", &n); while(n --) { scanf("%d", &m); res = f(m) / fun(m); printf("%.2f%%\n", res*100); } return 0; }