给定数字N。任务是找到1到N的排列数,以使排列的三个项都不形成递增的子序列。
例子:
Input : N = 3
Output : 5
Valid permutations : 132, 213, 231, 312 and 321 and not 123
Input : N = 4
Output : 14
上面的问题是加泰罗尼亚语数字的应用。因此,任务是仅找到第n个加泰罗尼亚编号。前几个加泰罗尼亚语数字是1,1,2,5,14,42,132,429,1430,4862,…(从0数开始考虑)
以下是查找第N个加泰罗尼亚语编号的程序:
C++
// C++ program to find the
// nth catalan number
#include
using namespace std;
// Returns value of Binomial Coefficient C(n, k)
unsigned long int binomialCoeff(unsigned int n,
unsigned int k)
{
unsigned long int res = 1;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n*(n-1)*---*(n-k+1)] / [k*(k-1)*---*1]
for (int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
// A Binomial coefficient based function
// to find nth catalan
// number in O(n) time
unsigned long int catalan(unsigned int n)
{
// Calculate value of 2nCn
unsigned long int c = binomialCoeff(2 * n, n);
// return 2nCn/(n+1)
return c / (n + 1);
}
// Driver code
int main()
{
int n = 3;
cout << catalan(n) << endl;
return 0;
}
Java
// Java program to find the
// nth catalan number
import java.io.*;
class GFG
{
// Returns value of Binomial
// Coefficient C(n, k)
static long binomialCoeff(long n, long k)
{
long res = 1;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n*(n-1)*---*(n-k+1)] /
// [k*(k-1)*---*1]
for (int i = 0; i < k; ++i)
{
res *= (n - i);
res /= (i + 1);
}
return res;
}
// A Binomial coefficient based
// function to find nth catalan
// number in O(n) time
static long catalan(long n)
{
// Calculate value of 2nCn
long c = binomialCoeff(2 * n, n);
// return 2nCn/(n+1)
return c / (n + 1);
}
// Driver code
public static void main (String[] args)
{
int n = 3;
System.out.println(catalan(n));
}
}
// This code has been contributed
// by inder_verma.
Python3
# Python program to find the
# nth catalan number
# Returns value of Binomial
# Coefficient C(n, k)
def binomialCoeff(n, k):
res = 1
# Since C(n, k) = C(n, n-k)
if k > n - k:
k=n-k
# Calculate value of
# [n*(n-1)*---*(n-k+1)] //
# [k*(k-1)*---*1]
for i in range(k):
res = res * (n - i)
res = res // (i + 1)
return res
# A Binomial coefficient based
# function to find nth catalan
# number in O(n) time
def catalan(n):
# Calculate value of 2nCn
c = binomialCoeff(2 * n, n)
# return 2nCn/(n+1)
return c // (n + 1)
# Driver code
n = 3
print(catalan(n))
# This code is contributed
# by sahil shelangia
C#
// C# program to find the
// nth catalan number
using System;
class GFG
{
// Returns value of Binomial
// Coefficient C(n, k)
static long binomialCoeff(long n,
long k)
{
long res = 1;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n*(n-1)*---*(n-k+1)] /
// [k*(k-1)*---*1]
for (int i = 0; i < k; ++i)
{
res *= (n - i);
res /= (i + 1);
}
return res;
}
// A Binomial coefficient based
// function to find nth catalan
// number in O(n) time
static long catalan(long n)
{
// Calculate value of 2nCn
long c = binomialCoeff(2 * n, n);
// return 2nCn/(n+1)
return c / (n + 1);
}
// Driver code
public static void Main (String[] args)
{
int n = 3;
Console.WriteLine(catalan(n));
}
}
// This code is contributed
// by Kirti_Mangal
PHP
$n - $k)
$k = $n - $k;
// Calculate value of
// [n*(n-1)*---*(n-k+1)] //
// [k*(k-1)*---*1]
for ($i = 0; $i < $k; $i++)
{
$res = $res * ($n - $i);
$res = $res / ($i + 1);
}
return $res;
}
// A Binomial coefficient based
// function to find nth catalan
// number in O(n) time
function catalan($n)
{
// Calculate value of 2nCn
$c = binomialCoeff(2 * $n, $n);
// return 2nCn/(n+1)
return $c / ($n + 1);
}
// Driver code
$n = 3;
print(catalan($n));
// This code is contributed
// by mits
?>
输出:
5