伯努利错排列问题

伯努利错排列问题,也称全错位排列,源于丹尼尔·伯努利提出的一个数学难题。欧拉给出递推公式f(n)=(n-1){f(n-1)+f(n-2)}来计算所有信封全错装的情况。例如,当有6封信时,有265种错装方法。输入包含多个正整数N(2≤N≤20),表示信的数量,输出对应每种数量下的错装种类数。

全错位排列:即被著名数学家欧拉(Leonhard Euler,1707-1783)称为组合数论的一个妙题的“装错信封问题”。
“装错信封问题”是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-1748)的儿子丹尼尔·伯努利(DanidBernoulli,1700-1782)提出来的,大意如下:
一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种?

递推公式

瑞士数学家欧拉按一般情况给出了一个递推公式:
用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作f(n)。假设把a错装进B里了,包含着这个错误的一切错装法分两类:
(1)b装入A里,这时每种错装的其余部分都与A、B、a、b无关,应有f(n-2)种错装法。
(2)b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的)(n-1 )份信纸b、c……装入(除B以外的)n-1个信封A、C……,显然这时装错的方法有f(n-1)种。(假设a和B是一组正确搭配,当然只是假设)
总之在a装入B的错误之下,共有错装法f(n-2)+f(n-1)种。a装入C,装入D……的n-2种错误之下,同样都有f(n-2)+f(n-1)种错装法,因此:
f(n)=(n-1) {f(n-1)+f(n-2)}
(摘自百度)
题目:
Bernoulli has a NN letter to send, and now there are NN letters encapsulating the NN letter. How many kinds of programs are there in any letter that does not fit into the correct envelope?

Input

The input data contains more than one test instance, each test instance takes one line and each row contains a positive integer NN (2≤N≤20)(2≤N≤20)

Sample input
6
8
Sample ouput
265
14833

#include <iostream>
#include <stdio.h>
using namespace std;

long long WrongSort(int n)
{
    if(n==1)
        return 0;
    if(n==2)
        return 1;
    return (n-1)*(WrongSort(n-1)+WrongSort(n-2));
}
int main()
{
    int n;
    while(cin>>n)
    {
        long long r=WrongSort(n);
        cout<<r<<endl;
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值