错排公式 方案数+概率

博客探讨了数学中错排问题的定义和计算方法,通过递推公式f[n]=(n-1)*(f[n-1]+f[n-2])阐述了最大错排方案数的求解。同时,提到了错排发生概率的表达式D(n)/n!,并指出当n!很大时,该概率接近于一个常数。最后,提供了C++代码实现来计算前20个整数的错排数。
摘要由CSDN通过智能技术生成

错排的定义:https://baike.baidu.com/item/%E9%94%99%E6%8E%92%E5%85%AC%E5%BC%8F/10978508?fr=aladdin
// 来自百度

精简: f[n] = (n - 1) * (f[n - 1] + f[n - 2])
f[n] 表示从第一个放到第n个的最大错排方案数,则 假设咱们要放第n号物品,首先把第n号物品拿在手里,那么n号就有一个空位了,现在咱们把第n号物品随意放在一个位置,因为是错排,不能放在n上,所以有(n - 1)个位置可以放,放完之后肯定会把另一个号的物品挤出来,假设是x,那么此时n就有了一个空位,并且手里拿这一个x。 此时,咱们分两种情况来讨论,第一种是x放在第n号的空位处,此时只是将x和n位置上的物品交换了位置,其他没有改变,因此接下来的操作就是把(n - 2)个物品错排,即:f[n - 2]。 第二种情况:x不放在第n的空位,此时咱们把x当成n,那么就变成了x位置不动了(因为已经有物品了),n不能放在n上,剩下的(n - 2) 个物品也要错排,所以就是n - 1个物品错排,即f [ n - 1];

so : 证毕

简化公式:
D(n) = [n! / e + 0.5] 挺对的!!!

发生错排的概率:
D(n) / n! (错排方案 / n的全排列)
当n!很大的时候这个概率减少的很少,不足1e-6的精确度
代码:

#include <bits/stdc++.h>
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
const double DINF = 1e20;
const double eps = 1e-8, e = 2.718282828;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int N = 4e2 + 50;

inline double Get_mul(int n)
{
    double res = 1;
    for (int i = 2; i <= n; i++) res *= i;

    return res;
}

ll f[N];

signed main(int argc, char* argv[])
{
    ll n; cin >> n; 

    for (int n = 1; n <= 20; n++)
    printf("%.6lf\n", 1.0 - floor(Get_mul(n) / e + 0.5) / Get_mul(n));

    f[1] = 0, f[2] = 1;

    for (int i = 3; i <= 15; i++) f[i] = (i - 1) * (f[i - 1] + f[i - 2]);

    return 0;
}
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值