首页 > 编程知识 正文

错排公式的使用方法,错排问题公式推导

时间:2023-05-05 22:16:54 阅读:178440 作者:4361

同时在我的个人博客上投稿了: https://hush HW.cn/posts/learn/15287.html

以下是原文:

我以前就面临着把公式排错的问题,但自己没有注意那个知识点。 本以为硬要记住就好了,但是不知道导出过程,完全记不住。 所以,今天我们来认真整理一下与错排仪式相关的几点吧。

误植式的推导

考虑有n个元素的数组。 如果一个数组中的所有元素都不在自己的原始位置,则这样的数组称为原始数组中的一个失配,n个元素的失配表示为d(n )。 其次,求出d(n )是多少中序列。

首先,考虑一下第一个元素的配置。 将元素1放在自己原来的位置以外的位置,共有(n-1 )种。 如果第一个元素位于第k个元素的位置,则对于第k个元素可以有两种情况。 第一,因为它不是第一个,所以下一个数组相当于n-1个元素的错误数组。 第二,因为它位于第一种元素的位置,序列d(n )中有两种元素已经找到了位置,所以我们只需要考虑n-2种元素的错误排列,即d ) n-2 )。 由此,递归式对于d(n )可以全部具有d ) n )=(n-1 ) * (d ) n-1 ) d ) n-2 ) ]【特殊情况下d )1)=0,d )2)=1】。

从这个递归关系导出的话,如下

为了便于运算,设d(n )=n! n(n )如下所示

n! n(n )=(n-1 ) ) n-2 )! n(n-2 ) ) n-1 ) ) n-1 )! n(n-1 ); 两边同时除以(n-1 )! 得到:

nn(n )=n(n-2 ) ) n-1 ) n ) n-1 ),移项:

n(n )-n ) (n-1 ) n(n )2)-n ) )1/n ) ) n )-1 )-n )2),因此可以挤出

n(n-1 )-n(n-2 )=--(1/) n-1 ) ) n )2(-n ) n-3 ) )

……

n(2)-n )1)=1/2;

由此,将各个式子相加,n(n )-n ) )1)=)1/2! - 1/3! 四分之一! ………(((-1 ) ^(n-1 ) )/(n-1 )! (-1 ) )接下来! ) )

因为n(1)=0,所以n ) n )=)1/2! - 1/3! 四分之一! ………(((-1 ) ^(n-1 ) )/(n-1 )! (-1 ) )接下来! 中,您将获得以下内容:

错误列的公式d(n )=n! (1/2! - 1/3! 四分之一! ………(((-1 ) ^(n-1 ) )/(n-1 )! (-1 ) )接下来! 请参阅。

求解错误公式的应用

【hdu2049】报考新郎

主题说明

在盛大的集体婚礼中,为了丰富婚礼,主持人临时想出了一个有趣的节目——《考新郎》。 具体操作就是这样的:

输入

输入数据的第一行是表示测试实例数的整数c,然后是c行中的数据,每行包含两个整数n和m。 M(1 M=N=20 )

输出功率

请为每个测试实例输出可能发生这种情况的数量。 每个实例的输出占一行。

样品输入

2

2 2

3 2

最初解决问题时,直接解决了数组组合c(n,m )。 没有考虑将m个要素d ) m )错误排列的问题。 这里,用以上两种方法分别写代码。

方法1 :递推公式d(n )=(n-1 ) * ) d ) n-1 ) d ) n-2 ) ) [d )1)=0,d )2)=1]

# include # include # includeusingnamespacestd;

龙龙f [ 22 ];

void init ()//误植

{

f[1]=0;

f[2]=1;

for(intI=3; i=20; I )

{

f[I]=(I-1 ) * ) *(f[i-1] f[i-2];

() ) ) ) )。

返回;

() ) ) ) )。

intc(intx,int y ) {

int n=x,m=y;

int sum=1,a=1,b=1;

for(intI=1; i=y; I ) {

*=n;

n----;

b*=m;

m----;

() ) ) ) )。

sum=a/b;

return sum;

() ) ) ) )。

int main ()。

int N,m;

init (;

wile(Scanf('%d%d ),n,m )!=EOF )

{

出局

方法2 :通式d(n )=n! *(1/2之2! -1/3! 四分之一! - 1/5! (((((((()-1 ) ) n-1 ) )/(n-1 )! ()-1 ) n )/n! ) )

首先简单地变形通项:

c(n,m ) d ) m )=) n! //m! (n-m )! (d ) m )=n! (1/2! -1/3! 四分之一! - 1/5! ((((((()-1 ) m-1 ) )/) m-1 )! ()-1 ) m )/m! () ) n-m )!

# include # include # includetypedeflonglongll;

using namespace std;

龙龙f [ 22 ];

intc(intn ) {

ll sum=1;

for(intI=1; i=n; I )

sum*=i;

return sum;

() ) ) ) )。

int main ()。

int N,m;

wile(Scanf('%d%d ),n,m )!=EOF )

{

lla=c(n ),sum=0,b=c ) ) n-m );

for(intI=2; i=M; I ) {

a/=i;

if(I%2==0) ) ) ) ) )。

sum=a;

else

sum-=a;

() ) ) ) )。

出局

正文内容如下

33558 blog.csdn.net/yangyu Hao 0408/article/details/50971170

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。