Given an integer ‘n’, print the first ‘n’ terms of the Moser-de Bruijn Sequence.
The Moser-de Bruijn sequence is the sequence obtained by adding up the distinct powers of the number 4 (For example 1, 4, 16, 64, etc).
Examples :
Input : 5 Output : 0 1 4 5 16 Input : 10 Output : 0 1 4 5 16 17 20 21 64 65
It is observed that the terms of the sequence follow the recurrence relation :
1) S(2 * n) = 4 * S(n) 2) S(2 * n + 1) = 4 * S(n) + 1 with S(0) = 0 and S(1) = 1
It may be noted here that any number which is the sum of non-distinct powers of 4 are not a part of the sequence. For example, 8 is not a part of the sequence because it is formed as the sum of non-distinct powers of 4, that are 4 and 4.
Thus, any number which is not a power of 4 and is present in the sequence must be the sum of the distinct powers of 4.
For example, 21 is a part of the sequence, even though it is not a power of 4 because it is the sum of the distinct powers of 4, that are 1, 4 and 16.
Employ the recurrence relation discussed above to generate the sequence, efficiently.
C++
// CPP code to generate first 'n' terms // of the Moser-de Bruijn Sequence #include <bits/stdc++.h> using namespace std; // Function to generate nth term // of Moser-de Bruijn Sequence int gen( int n) { // S(0) = 0 if (n == 0) return 0; // S(1) = 1 else if (n == 1) return 1; // S(2 * n) = 4 * S(n) else if (n % 2 == 0) return 4 * gen(n / 2); // S(2 * n + 1) = 4 * S(n) + 1 else if (n % 2 == 1) return 4 * gen(n / 2) + 1; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence void moserDeBruijn( int n) { for ( int i = 0; i < n; i++) cout << gen(i) << " " ; cout << "\n" ; } // Driver Code int main() { int n = 15; cout << "First " << n << " terms of " << "Moser-de Bruijn Sequence : \n" ; moserDeBruijn(n); return 0; } |
Java
// Java code to generate first 'n' terms // of the Moser-de Bruijn Sequence class GFG { // Function to generate nth term // of Moser-de Bruijn Sequence public static int gen( int n) { // S(0) = 0 if (n == 0 ) return 0 ; // S(1) = 1 else if (n == 1 ) return 1 ; // S(2 * n) = 4 * S(n) else if (n % 2 == 0 ) return 4 * gen(n / 2 ); // S(2 * n + 1) = 4 * S(n) + 1 else if (n % 2 == 1 ) return 4 * gen(n / 2 ) + 1 ; return 0 ; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence public static void moserDeBruijn( int n) { for ( int i = 0 ; i < n; i++) System.out.print(gen(i) + " " ); System.out.println(); } // Driver Code public static void main(String args[]) { int n = 15 ; System.out.println( "First " + n + " terms of " + "Moser-de Bruijn Sequence : " ); moserDeBruijn(n); } } // This code is contributed by JaideepPyne. |
Python3
# Python code to generate first # 'n' terms of the Moser-de # Bruijn Sequence # Function to generate nth term # of Moser-de Bruijn Sequence def gen(n): # S(0) = 0 if n = = 0 : return 0 # S(1) = 1 elif n = = 1 : return 1 # S(2 * n) = 4 * S(n) elif n % 2 = = 0 : return 4 * gen(n / / 2 ) # S(2 * n + 1) = 4 * S(n) + 1 elif n % 2 = = 1 : return 4 * gen(n / / 2 ) + 1 # Generating the first 'n' terms # of Moser-de Bruijn Sequence def moserDeBruijn(n): for i in range (n): print (gen(i), end = " " ) # Driver Program n = 15 print ( "First" , n, "terms of " , "Moser-de Brujn Sequence:" ) moserDeBruijn(n) # This code is contributed by Shrikant13 |
C#
// C# code to generate first 'n' terms // of the Moser-de Bruijn Sequence using System; class GFG { // Function to generate nth term // of Moser-de Bruijn Sequence public static int gen( int n) { // S(0) = 0 if (n == 0) return 0; // S(1) = 1 else if (n == 1) return 1; // S(2 * n) = 4 * S(n) else if (n % 2 == 0) return 4 * gen(n / 2); // S(2 * n + 1) = 4 * S(n) + 1 else if (n % 2 == 1) return 4 * gen(n / 2) + 1; return 0; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence public static void moserDeBruijn( int n) { for ( int i = 0; i < n; i++) Console.Write(gen(i) + " " ); Console.WriteLine(); } // Driver Code public static void Main() { int n = 15; Console.WriteLine( "First " + n + " terms of " + "Moser-de Bruijn Sequence : " ); moserDeBruijn(n); } } // This code is contributed by anuj_67. |
PHP
<?php // PHP code to generate first 'n' terms // of the Moser-de Bruijn Sequence // Function to generate nth term // of Moser-de Bruijn Sequence function gen( $n ) { // S(0) = 0 if ( $n == 0) return 0; // S(1) = 1 else if ( $n == 1) return 1; // S(2 * n) = 4 * S(n) else if ( $n % 2 == 0) return 4 * gen( $n / 2); // S(2 * n + 1) = 4 * S(n) + 1 else if ( $n % 2 == 1) return 4 * gen( $n / 2) + 1; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence function moserDeBruijn( $n ) { for ( $i = 0; $i < $n ; $i ++) echo (gen( $i ) . " " ); echo ( "\n" ); } // Driver Code $n = 15; echo ( "First " . $n . " terms of " . "Moser-de Bruijn Sequence : \n" ); echo (moserDeBruijn( $n )); // This code is contributed by Ajit. ?> |
Output :
First 15 terms of Moser-de Bruijn Sequence : 0 1 4 5 16 17 20 21 64 65 68 69 80 81 84
Dynamic Programming Implementation:
C++
// CPP code to generate first 'n' terms // of the Moser-de Bruijn Sequence #include <bits/stdc++.h> using namespace std; // Function to generate nth term // of Moser-de Bruijn Sequence int gen( int n) { int S[n+1]; S[0] = 0; S[1] = 1; for ( int i = 2; i <= n; i++) { // S(2 * n) = 4 * S(n) if (i % 2 == 0) S[i] = 4 * S[i / 2]; // S(2 * n + 1) = 4 * S(n) + 1 else S[i] = 4 * S[i / 2] + 1; } return S[n]; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence void moserDeBruijn( int n) { for ( int i = 0; i < n; i++) cout << gen(i) << " " ; cout << "\n" ; } // Driver Code int main() { int n = 15; cout << "First " << n << " terms of " << "Moser-de Bruijn Sequence : \n" ; moserDeBruijn(n); return 0; } |
Java
// Java code to generate first 'n' terms // of the Moser-de Bruijn Sequence class GFG { // Function to generate nth term // of Moser-de Bruijn Sequence static int gen( int n) { int []S = new int [n + 1 ]; S[ 0 ] = 0 ; if (n != 0 ) S[ 1 ] = 1 ; for ( int i = 2 ; i <= n; i++) { // S(2 * n) = 4 * S(n) if (i % 2 == 0 ) S[i] = 4 * S[i / 2 ]; // S(2 * n + 1) = 4 * S(n) + 1 else S[i] = 4 * S[i/ 2 ] + 1 ; } return S[n]; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence static void moserDeBruijn( int n) { for ( int i = 0 ; i < n; i++) System.out.print(gen(i)+ " " ); } // Driver Code public static void main(String[] args) { int n = 15 ; System.out.println( "First " + n + " terms of " + "Moser-de Bruijn Sequence : " ); moserDeBruijn(n); } } // This code is contributed by // Smitha Dinesh Semwal. |
python3
# python3 code to generate first 'n' terms # of the Moser-de Bruijn Sequence # Function to generate nth term # of Moser-de Bruijn Sequence def gen( n ): S = [ 0 , 1 ] for i in range ( 2 , n + 1 ): # S(2 * n) = 4 * S(n) if i % 2 = = 0 : S.append( 4 * S[ int (i / 2 )]); # S(2 * n + 1) = 4 * S(n) + 1 else : S.append( 4 * S[ int (i / 2 )] + 1 ); z = S[n]; return z; # Generating the first 'n' terms # of Moser-de Bruijn Sequence def moserDeBruijn(n): for i in range (n): print (gen(i), end = " " ) # Driver Code n = 15 print ( "First" , n, "terms of " , "Moser-de Brujn Sequence:" ) moserDeBruijn(n) # This code is contributed by mits. |
C#
// C# code to generate first 'n' terms // of the Moser-de Bruijn Sequence using System; class GFG { // Function to generate nth term // of Moser-de Bruijn Sequence static int gen( int n) { int []S = new int [n + 1]; S[0] = 0; if (n != 0) S[1] = 1; for ( int i = 2; i <= n; i++) { // S(2 * n) = 4 * S(n) if (i % 2 == 0) S[i] = 4 * S[i / 2]; // S(2 * n + 1) = 4 * S(n) + 1 else S[i] = 4 * S[i/2] + 1; } return S[n]; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence static void moserDeBruijn( int n) { for ( int i = 0; i < n; i++) Console.Write(gen(i)+ " " ); } // Driver Code public static void Main() { int n = 15; Console.WriteLine( "First " + n + " terms of " + "Moser-de Bruijn Sequence : " ); moserDeBruijn(n); } } // This code is contributed by // Smitha Dinesh Semwal. |
PHP
<?php // PHP code to generate first 'n' terms // of the Moser-de Bruijn Sequence // Function to generate nth term // of Moser-de Bruijn Sequence function gen( $n ) { $S = array (); $S [0] = 0; $S [1] = 1; for ( $i = 2; $i <= $n ; $i ++) { // S(2 * n) = 4 * S(n) if ( $i % 2 == 0) $S [ $i ] = 4 * $S [ $i / 2]; // S(2 * n + 1) = 4 * S(n) + 1 else $S [ $i ] = 4 * $S [ $i /2] + 1; } return $S [ $n ]; } // Generating the first 'n' terms // of Moser-de Bruijn Sequence function moserDeBruijn( $n ) { for ( $i = 0; $i < $n ; $i ++) echo gen( $i ) , " " ; echo "\n" ; } // Driver Code $n = 15; echo "First " , $n , " terms of " , "Moser-de Bruijn Sequence : \n" ; moserDeBruijn( $n ); // This code is contributed by anuj_67. ?> |
Output :
First 15 terms of Moser-de Bruijn Sequence : 0 1 4 5 16 17 20 21 64 65 68 69 80 81 84
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.