全错位排列

全错位排列是由著名数学家欧拉提出的。

最典型的问题是装错信封问题

一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种?

用a、b、c,d……表示n份相应的写好的信纸,A、B、C,D……表示写着n位友人名字的信封,错装的总数为记作f(n)。

假设把a错装进B中,然后接下来我们可以分为两种情况,

第一种是b错装进了A中,那么问题就变为c,d,e…..n-2个信纸放入C,D,E……n-2个信封时完全放错时完全装错有多少种,有f(n-2)种

第二种是b错装进了除A之外的一个信封内,这个时候问题就相当于已知a错装进B中,将b,c,d,e…..n-2个信纸放入A,C,D,E……n-2个信封时,b不能放入A中,这里如果我们把A

想象成B0的话,就相当于将b,c,d,e…..n-2个信纸放入B0,C,D,E……n-2个信封时完全放错,有f(n-1)种

a错装进B中,有f(n-1)+f(n-2)种,同样a错装进C中也有f(n-1)+f(n-2)种…..

a错装进B中,有f(n-1)+f(n-2)种

a错装进C中,有f(n-1)+f(n-2)种

a错装进D中,有f(n-1)+f(n-2)种

a错装进E中,有f(n-1)+f(n-2)种

a错装进F中,有f(n-1)+f(n-2)种

所以一共有

f(n)=(n-1)(f(n-1)+f(n-2));

 

//C++示例代码
#include <iostream>
using namespace std;

long long getvalue(int num)
{
    if (num == 1)
    {
        return 0;
    }
    else if (num == 2)
    {
        return 1;
    }
    else if (num == 3)
    {
        return 2;
    }
    else
    {
        long long f1 = 1;
        long long f2 = 2;
        for (int i = 4; i <= num; i++)
        {
            long long t = f2;
            f2 = (i - 1)*(f1 + f2);
            f1 = t;
        }
        return f2;
    }
}

int main()
{
    int num;
    cout << "input the number of envelop with -1 to end" << endl;
    while (cin>>num)
    {
        if (num == -1)
            break;
        long long r = getvalue(num);
        cout<<"Result:" << r << endl;
    }
    return 0;
}

 

相关的题目有

http://acm.hdu.edu.cn/showproblem.php?pid=2049

假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.

 

http://acm.hdu.edu.cn/showproblem.php?pid=2048

神,上帝和老天爷

时间: 2024-10-11 06:14:46

全错位排列的相关文章

《程序设计中的组合数学》——全错位排列

承接上文,这次以递推的思维,介绍组合学当中一个很经典的问题. 这个问题最开始由瑞士数学家欧拉提出,原始的问题被叫做“装信封问题”,问题的大意就是:有n封信和n封它们各自对应的信封,如果邮递员想要把每封信都放在不属于这封信的信封,那么请问有多少种排法.(这邮递员真无聊)  想必这个问题在中学阶段数学的[排列组合]都有过接触,但是我记忆非常深刻的是,老师讲到这个模型,自己找了一下n = 5的情况就停止了,然后让大家把前面的数字序列背下来.今日故地重游不禁觉得老师教的好坑爹,搞学习还是要亲历亲为自主探

hdoj 2049 不容易系列之(4)——考新郎 【全错位排列】【组合数】

方法如题. 全错位排列 不容易系列之(4)--考新郎 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21347    Accepted Submission(s): 7857 Problem Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎

组合数学 - 全错位排序公式

不容易系列之一 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样.话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的.比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情.如果套用一句经典的评语,我们可以这样总

关于错位排列

今天弄了一下错位排列,似乎挺简单的... 错位排列问题的描述大致如下:给定n个信封以及n个信,每个信只能容纳在,第i号信需要放在第i号信封里,现在所有信封的位置都是错误的,求不同的错误方案数. 因为第i号信是不在第i号信封里面的,这样的话我们可以模拟出以下n*n的矩阵(其中1表示信封错误的位置不能是此处): 1,0,0,0 不难看出来,对于第一行来说我们有3种不同的方案,在某个点被占据时,其所在的排,列,都没有意义了,这样的话我们可以得到3个新的矩阵: 0,1,0,0 1: 0,0,0 2:0,

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

生成所有错位排列的算法

所谓N元错位排列,就是指对应于1,2,--,N的N元排列Im(m=1,2,---,N),满足Im!=m,算法的目的是构造出所有这样的错位排列,依据的基本思想是回溯法,在沿栈向下试探的过程中逐步扩大部分错位排列的规模,当发现无法找到下一个部分错位排列的元素时就向上回溯,继续试探,当栈空间首元素stack[0]==N+1时,表明首元素为2,--,N的所有错位排列已全部试探得到,错位排列生成完毕,退出循环.这里给出算法,该算法生成对应于1,2,---,N的所有N元错位排列 代码(C++) 1 #inc

错位排列及有关例题

求n个数(不相同)错位排列的个数. 何为错位排列?定义如下:对于n的一个排列a1,a2,a3...an. 如何求解错位排列? 考虑动态规划的解法. 前i个元素时如何进行状态转移? (一)首先由于要求错位排列,第i个元素肯定不会放在自己的位置上,故第i个元素的位置有i-1种选择. (二)对于剩下的i-1个元素,选择其中的一个元素k.这时候k有两种选择: 1. 放在第i个元素的位置上,宏观上相当于i与k的位置互换了.而剩下的i-2个元素依然要求错位排列. 2. 不放在第i个元素的位置上,则相当于剩下

[Luogu4921]情侣?给我烧了![错位排列]

题意 题意很清楚 \滑稽 分析 对于每一个询问 \(k\) ,记 \(g(x)\) 表示 \(x\) 对情侣都错开的方案总数,那么答案可以写成如下形式: \[ {ans}_k= \binom{n}{k}\times A_n^k\times 2^k\times g(n-k) \] 考虑如何求 \(g(x)\) (一个错位排列). 考虑第一排,一共有三种情况:两男两女或者一男一女(不配对). 两男:顺次选出两男的方案数为 \(x(x-1)\) ,然后考虑他们的配偶在之后的配对情况: 如果强制不配对,

luogu4931.情侣?给我烧了!(加强版)(错位排列)

题目链接 https://www.luogu.org/problemnew/show/P4931 题解 以下部分是我最开始的想法. 对于每一个 \(k\),满足恰好有 \(k\) 对情侣和睦的方案数为 \[\binom{n}{k} × \binom{n}{k} × k! × 2^k × f_{n - k}\] 其中,\(f_x\) 表示 \(x\) 对情侣坐 \(x\) 排座位且没有任何一对情侣坐在同一排的方案数. 上述式子的意义为:从 \(n\) 对情侣中选出 \(k\) 对作为和睦的,再从