C ++中的欧拉数

在数学中,欧拉数 是一种特殊的组合数。它定义了排列的数量,其中下一个元素比上一个元素大特定数量。

表示为 

A(n, m) 是从1到n的排列,其中两个数字相差m。

问题陈述: 在这个问题上,我们给了两个数字m和n。我们需要找到作为欧拉数的排列数。

让我们举个例子来了解这个问题,

输入:   n = 4,m = 2

输出:  11

解释: 

从1到4的所有数字排列都是-

1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2
2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 2 4 1 3 2 4 3 1
3 1 2 4 3 1 4 2 3 2 1 4 3 2 4 1 3 4 1 2 3 4 2 1
4 1 2 3 4 1 3 2 4 2 1 3 4 2 3 1 4 3 1 2 4 3 2 1

在所有11排列中,有两个数字m之差。 


解决方法-

为了找到排列的数量,我们将使用欧拉数的公式,

A(n, m)如果m> n或n = 0
           A(n, m)= 1,则= 0,如果m = 0
           A(n, m)=(nm)A(n-1,m-1)+(m + 1)A(n-1,m)
 

该程序说明了我们解决方案的工作原理,

示例

#include <iostream>
using namespace std;

int countEulerianNumber(int n, int m)
{
   if (m >= n || n == 0)
      return 0;
   if (m == 0)
      return 1;
   return ( ( (n - m) * countEulerianNumber(n - 1, m - 1) ) + ( (m + 1) * countEulerianNumber(n - 1, m) ) );
}

int main() {

   int n = 5, m = 3;
   cout<<"欧拉排列的数量是 "<<countEulerianNumber(n, m);
   return 0;
}

输出-

欧拉排列的数量是 26