首先,所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”这次抽奖活动最后竟然没有一个人中奖!
你能计算一下发生这种情况的概率吗?
Inputcopy Outputcopy 1 2 50.00%
经过我不懈的努力(bushi,终于将递推公式推出来了,虽然说大佬的公式是这样的
f(n)=(n-1)*f(n-1)+(n-1)*f(n-2);
// 错排问题
#include <iostream>
using namespace std;
typedef long long LL;
int n, c;
LL fact[30], f[30];
void init_fact()
{
LL s = 1;
for (int i = 1; i <= 20; i++)
{
s *= i;
fact[i] = s;
}
}
void init_f()
{
f[1] = 0;
for (int i = 2; i <= 20; i++)
{
LL a = 0, sum = 0;
a = fact[i];
for (int j = 1; j <= i - 2; j++)
{
LL b = fact[i] / (fact[j] * fact[i - j]);
sum += b * f[i - j];
}
f[i] = a - sum - 1;
}
}
int main()
{
cin >> c;
init_fact();
init_f();
while (c--)
{
cin >> n;
double p = (double)f[n] / fact[n];
p *= 100;
printf("%.2lf%%", p);
}
return 0;
}