Count the number of ordered sets not containing consecutive numbers
Last Updated :
06 Apr, 2023
Given a positive integer N. Count the total number of ordered sets of any size such that consecutive numbers are not present in the set and all numbers are <= N.
Ordered Set: Arrays in which all numbers are distinct, and order of elements is taken into consideration, For e.g. {1, 2, 3} is different from {1, 3, 2}.
Examples:
Input: N = 3
Output: 5
Explanation:
The ordered sets are:
{1}, {2}, {3}, {1, 3}, {3, 1}
Input: N = 6
Output: 50
Naive Approach:
- We will use Recursion to solve this problem. If we obtain a count say C of the ordered set where elements are in ascending/descending order and the set size is S, then total count for this size will
- We will do this for each ordered set of distinct sizes.
- Iterate on all ordered set sizes and for each size find the count of ordered sets and multiply by factorial of size ( S! ). At each recursive step, we have two options –
- Include the current element x and move to the next position with maximum element that can be included now as x – 2.
- Do not include the current element x and stay at the current position with maximum element that can be included now as x – 1.
- So the recursive relation is :
countSets(x, pos) = countSets(x-2, pos-1) + countSets(x-1, pos)
C++
#include <bits/stdc++.h>
using namespace std;
int CountSets( int x, int pos)
{
if (x <= 0) {
if (pos == 0)
return 1;
else
return 0;
}
if (pos == 0)
return 1;
int answer = CountSets(x - 1, pos)
+ CountSets(x - 2, pos - 1);
return answer;
}
int CountOrderedSets( int n)
{
int factorial[10000];
factorial[0] = 1;
for ( int i = 1; i < 10000; i++)
factorial[i] = factorial[i - 1] * i;
int answer = 0;
for ( int i = 1; i <= n; i++) {
int sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
int main()
{
int N = 3;
cout << CountOrderedSets(N);
return 0;
}
|
Java
class GFG{
static int CountSets( int x, int pos)
{
if (x <= 0 )
{
if (pos == 0 )
return 1 ;
else
return 0 ;
}
if (pos == 0 )
return 1 ;
int answer = CountSets(x - 1 , pos) +
CountSets(x - 2 , pos - 1 );
return answer;
}
static int CountOrderedSets( int n)
{
int []factorial = new int [ 10000 ];
factorial[ 0 ] = 1 ;
for ( int i = 1 ; i < 10000 ; i++)
factorial[i] = factorial[i - 1 ] * i;
int answer = 0 ;
for ( int i = 1 ; i <= n; i++)
{
int sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
public static void main(String[] args)
{
int N = 3 ;
System.out.print(CountOrderedSets(N));
}
}
|
Python3
def CountSets(x, pos):
if (x < = 0 ):
if (pos = = 0 ):
return 1
else :
return 0
if (pos = = 0 ):
return 1
answer = (CountSets(x - 1 , pos) +
CountSets(x - 2 , pos - 1 ))
return answer
def CountOrderedSets(n):
factorial = [ 1 for i in range ( 10000 )]
factorial[ 0 ] = 1
for i in range ( 1 , 10000 , 1 ):
factorial[i] = factorial[i - 1 ] * i
answer = 0
for i in range ( 1 , n + 1 , 1 ):
sets = CountSets(n, i) * factorial[i]
answer = answer + sets
return answer
if __name__ = = '__main__' :
N = 3
print (CountOrderedSets(N))
|
C#
using System;
class GFG{
static int CountSets( int x, int pos)
{
if (x <= 0)
{
if (pos == 0)
return 1;
else
return 0;
}
if (pos == 0)
return 1;
int answer = CountSets(x - 1, pos) +
CountSets(x - 2, pos - 1);
return answer;
}
static int CountOrderedSets( int n)
{
int []factorial = new int [10000];
factorial[0] = 1;
for ( int i = 1; i < 10000; i++)
factorial[i] = factorial[i - 1] * i;
int answer = 0;
for ( int i = 1; i <= n; i++)
{
int sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
public static void Main(String[] args)
{
int N = 3;
Console.Write(CountOrderedSets(N));
}
}
|
Javascript
<script>
function CountSets(x , pos)
{
if (x <= 0) {
if (pos == 0)
return 1;
else
return 0;
}
if (pos == 0)
return 1;
var answer = CountSets(x - 1, pos) +
CountSets(x - 2, pos - 1);
return answer;
}
function CountOrderedSets(n) {
var factorial = Array(10000).fill(0);
factorial[0] = 1;
for (i = 1; i < 10000; i++)
factorial[i] = factorial[i - 1] * i;
var answer = 0;
for (i = 1; i <= n; i++) {
var sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
var N = 3;
document.write(CountOrderedSets(N));
</script>
|
Time Complexity: O(2N)
Efficient Approach:
- In the recursive approach, we are solving subproblems multiple times, i.e. it follows the Overlapping Subproblems Property in Dynamic Programming. So we can use a memorization table or cache to make the solution efficient.
C++
#include <bits/stdc++.h>
using namespace std;
int dp[500][500];
int CountSets( int x, int pos)
{
if (x <= 0) {
if (pos == 0)
return 1;
else
return 0;
}
if (pos == 0)
return 1;
if (dp[x][pos] != -1)
return dp[x][pos];
int answer = CountSets(x - 1, pos)
+ CountSets(x - 2, pos - 1);
return dp[x][pos] = answer;
}
int CountOrderedSets( int n)
{
int factorial[10000];
factorial[0] = 1;
for ( int i = 1; i < 10000; i++)
factorial[i] = factorial[i - 1] * i;
int answer = 0;
memset (dp, -1, sizeof (dp));
for ( int i = 1; i <= n; i++) {
int sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
int main()
{
int N = 3;
cout << CountOrderedSets(N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int [][]dp = new int [ 500 ][ 500 ];
static int CountSets( int x, int pos)
{
if (x <= 0 )
{
if (pos == 0 )
return 1 ;
else
return 0 ;
}
if (pos == 0 )
return 1 ;
if (dp[x][pos] != - 1 )
return dp[x][pos];
int answer = CountSets(x - 1 , pos) +
CountSets(x - 2 , pos - 1 );
return dp[x][pos] = answer;
}
static int CountOrderedSets( int n)
{
int []factorial = new int [ 10000 ];
factorial[ 0 ] = 1 ;
for ( int i = 1 ; i < 10000 ; i++)
factorial[i] = factorial[i - 1 ] * i;
int answer = 0 ;
for ( int i = 0 ; i < 500 ; i++)
{
for ( int j = 0 ; j < 500 ; j++)
{
dp[i][j] = - 1 ;
}
}
for ( int i = 1 ; i <= n; i++)
{
int sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
public static void main(String[] args)
{
int N = 3 ;
System.out.print(CountOrderedSets(N));
}
}
|
Python3
dp = [[ - 1 for j in range ( 500 )]
for i in range ( 500 )]
def CountSets(x, pos):
if (x < = 0 ):
if (pos = = 0 ):
return 1
else :
return 0
if (pos = = 0 ):
return 1
if (dp[x][pos] ! = - 1 ):
return dp[x][pos]
answer = (CountSets(x - 1 , pos) +
CountSets(x - 2 , pos - 1 ))
dp[x][pos] = answer
return answer
def CountOrderedSets(n):
factorial = [ 0 for i in range ( 10000 )]
factorial[ 0 ] = 1
for i in range ( 1 , 10000 ):
factorial[i] = factorial[i - 1 ] * i
answer = 0
for i in range ( 1 , n + 1 ):
sets = CountSets(n, i) * factorial[i]
answer = answer + sets
return answer
if __name__ = = "__main__" :
N = 3
print (CountOrderedSets(N))
|
C#
using System;
class GFG{
static int [,]dp = new int [500, 500];
static int CountSets( int x, int pos)
{
if (x <= 0)
{
if (pos == 0)
return 1;
else
return 0;
}
if (pos == 0)
return 1;
if (dp[x,pos] != -1)
return dp[x, pos];
int answer = CountSets(x - 1, pos) +
CountSets(x - 2, pos - 1);
return dp[x, pos] = answer;
}
static int CountOrderedSets( int n)
{
int []factorial = new int [10000];
factorial[0] = 1;
for ( int i = 1; i < 10000; i++)
factorial[i] = factorial[i - 1] * i;
int answer = 0;
for ( int i = 0; i < 500; i++)
{
for ( int j = 0; j < 500; j++)
{
dp[i, j] = -1;
}
}
for ( int i = 1; i <= n; i++)
{
int sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
public static void Main(String[] args)
{
int N = 3;
Console.Write(CountOrderedSets(N));
}
}
|
Javascript
<script>
var dp = Array.from(Array(500), ()=>Array(500));
function CountSets(x, pos)
{
if (x <= 0) {
if (pos == 0)
return 1;
else
return 0;
}
if (pos == 0)
return 1;
if (dp[x][pos] != -1)
return dp[x][pos];
var answer = CountSets(x - 1, pos)
+ CountSets(x - 2, pos - 1);
return dp[x][pos] = answer;
}
function CountOrderedSets(n)
{
var factorial = Array(10000).fill(0);
factorial[0] = 1;
for ( var i = 1; i < 10000; i++)
factorial[i] = factorial[i - 1] * i;
var answer = 0;
dp = Array.from(Array(500), ()=>Array(500).fill(-1));
for ( var i = 1; i <= n; i++) {
var sets = CountSets(n, i) * factorial[i];
answer = answer + sets;
}
return answer;
}
var N = 3;
document.write( CountOrderedSets(N));
</script>
|
Time Complexity: O(N2)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...