Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmCount the occurrence of Nth term in first N terms of Van...

Count the occurrence of Nth term in first N terms of Van Eck’s sequence

Prerequisite: Van Eck’s sequence Given a positive integer N, the task is to count the occurrences of Nth term in the first N terms of Van Eck’s sequence. Examples:

Input: N = 5 Output: 1 Explanation: First 5 terms of Van Eck’s Sequence 0, 0, 1, 0, 2 Occurrence of 5th term i.e 2 = 1 Input: 11 Output: 5 Explanation: First 11 terms of Van Eck’s Sequence 0, 0, 1, 0, 2, 0, 2, 2, 1, 6, 0, Occurrence of 11th term i.e 0 is 5

  1. Naive Approach:
    • Generate Van Eck’s sequence upto Nth term
    • Iterate through the generated sequence and count the occurrence of Nth term.

Below is the implementation of the above approach:

C++




// C++ program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
#include <bits/stdc++.h>
using namespace std;
 
#define MAX 100000
int sequence[MAX + 1];
 
// Utility function to compute
// Van Eck's sequence
void vanEckSequence()
{
 
    // Initialize sequence array
    for (int i = 0; i < MAX; i++) {
        sequence[i] = 0;
    }
 
    // Loop to generate sequence
    for (int i = 0; i < MAX; i++) {
 
        // Check if sequence[i] has occurred
        // previously or is new to sequence
        for (int j = i - 1; j >= 0; j--) {
            if (sequence[j] == sequence[i]) {
 
                // If occurrence found
                // then the next term will be
                // how far back this last term
                // occurred previously
                sequence[i + 1] = i - j;
                break;
            }
        }
    }
}
 
// Utility function to count
// the occurrence of nth term
// in first n terms of the sequence
int getCount(int n)
{
 
    // Get nth term of the sequence
    int nthTerm = sequence[n - 1];
 
    int count = 0;
 
    // Count the occurrence of nth term
    // in first n terms of the sequence
    for (int i = 0; i < n; i++) {
 
        if (sequence[i] == nthTerm)
            count++;
    }
 
    // Return count
    return count;
}
 
// Driver code
int main()
{
 
    // Pre-compute Van Eck's sequence
    vanEckSequence();
 
    int n = 5;
 
    // Print count of the occurrence of nth term
    // in first n terms of the sequence
    cout << getCount(n) << endl;
 
    n = 11;
 
    // Print count of the occurrence of nth term
    // in first n terms of the sequence
    cout << getCount(n) << endl;
 
    return 0;
}


Java




// Java program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
class GFG {
 
    static int MAX = 100000;
    static int sequence[] = new int[MAX + 1];
 
    // Utility function to compute
    // Van Eck's sequence
    static void vanEckSequence()
    {
 
        // Initialize sequence array
        for (int i = 0; i < MAX; i++) {
            sequence[i] = 0;
        }
 
        // Loop to generate sequence
        for (int i = 0; i < MAX; i++) {
 
            // Check if sequence[i] has occurred
            // previously or is new to sequence
            for (int j = i - 1; j >= 0; j--) {
                if (sequence[j] == sequence[i]) {
 
                    // If occurrence found
                    // then the next term will be
                    // how far back this last term
                    // occurred previously
                    sequence[i + 1] = i - j;
                    break;
                }
            }
        }
    }
 
    // Utility function to count
    // the occurrence of nth term
    // in first n terms of the sequence
    static int getCount(int n)
    {
 
        // Get nth term of the sequence
        int nthTerm = sequence[n - 1];
 
        int count = 0;
 
        // Count the occurrence of nth term
        // in first n terms of the sequence
        for (int i = 0; i < n; i++) {
 
            if (sequence[i] == nthTerm)
                count++;
        }
 
        // Return count
        return count;
    }
 
    // Driver code
    public static void main(String[] args)
    {
 
        // Pre-compute Van Eck's sequence
        vanEckSequence();
 
        int n = 5;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        System.out.println(getCount(n));
 
        n = 11;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        System.out.println(getCount(n));
    }
}


Python3




# Python3 program to count the occurrence
# of nth term in first n terms
# of Van Eck's sequence
 
MAX = 10000
sequence = [0]*(MAX + 1);
 
# Utility function to compute
# Van Eck's sequence
def vanEckSequence() :
     
    # Loop to generate sequence
    for i in range(MAX) :
 
        # Check if sequence[i] has occurred
        # previously or is new to sequence
        for j in range(i - 1, -1, -1) :
            if (sequence[j] == sequence[i]) :
 
                # If occurrence found
                # then the next term will be
                # how far back this last term
                # occurred previously
                sequence[i + 1] = i - j;
                break;
 
# Utility function to count
# the occurrence of nth term
# in first n terms of the sequence
def getCount(n) :
 
    # Get nth term of the sequence
    nthTerm = sequence[n - 1];
 
    count = 0;
 
    # Count the occurrence of nth term
    # in first n terms of the sequence
    for i in range(n) :
 
        if (sequence[i] == nthTerm) :
            count += 1;
 
    # Return count
    return count;
 
# Driver code
if __name__ == "__main__" :
 
    # Pre-compute Van Eck's sequence
    vanEckSequence();
 
    n = 5;
 
    # Print count of the occurrence of nth term
    # in first n terms of the sequence
    print(getCount(n));
 
    n = 11;
 
    # Print count of the occurrence of nth term
    # in first n terms of the sequence
    print(getCount(n));
 
# This code is contributed by AnkitRai01


C#




// C# program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
using System;
class GFG {
 
    static int MAX = 100000;
    static int[] sequence = new int[MAX + 1];
 
    // Utility function to compute
    // Van Eck's sequence
    static void vanEckSequence()
    {
 
        // Initialize sequence array
        for (int i = 0; i < MAX; i++) {
            sequence[i] = 0;
        }
 
        // Loop to generate sequence
        for (int i = 0; i < MAX; i++) {
 
            // Check if sequence[i] has occurred
            // previously or is new to sequence
            for (int j = i - 1; j >= 0; j--) {
                if (sequence[j] == sequence[i]) {
 
                    // If occurrence found
                    // then the next term will be
                    // how far back this last term
                    // occurred previously
                    sequence[i + 1] = i - j;
                    break;
                }
            }
        }
    }
 
    // Utility function to count
    // the occurrence of nth term
    // in first n terms of the sequence
    static int getCount(int n)
    {
 
        // Get nth term of the sequence
        int nthTerm = sequence[n - 1];
 
        int count = 0;
 
        // Count the occurrence of nth term
        // in first n terms of the sequence
        for (int i = 0; i < n; i++) {
 
            if (sequence[i] == nthTerm)
                count++;
        }
 
        // Return count
        return count;
    }
 
    // Driver code
    public static void Main()
    {
 
        // Pre-compute Van Eck's sequence
        vanEckSequence();
 
        int n = 5;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        Console.WriteLine(getCount(n));
 
        n = 11;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        Console.WriteLine(getCount(n));
    }
}


Javascript




// Define MAX
const MAX = 10000;
 
// Create sequence array
let sequence = new Array(MAX + 1).fill(0);
//Javascript Equivalent
 
// Utility function to compute Van Eck's sequence
function vanEckSequence() {
 
    // Loop to generate sequence
    for (let i = 0; i <= MAX; i++) {
     
        // Check if sequence[i] has occurred previously or is new to sequence
        for (let j = i - 1; j >= 0; j--) {
            if (sequence[j] == sequence[i]) {
             
                // If occurrence found then the next term
                // will be how far back this last term occurred previously
                sequence[i + 1] = i - j;
                break;
            }
        }
    }
}
 
// Utility function to count the occurrence
// of nth term in first n terms of the sequence
function getCount(n) {
    // Get nth term of the sequence
    let nthTerm = sequence[n - 1];
 
    let count = 0;
 
    // Count the occurrence of nth term
    // in first n terms of the sequence
    for (let i = 0; i < n; i++) {
        if (sequence[i] == nthTerm) {
            count++;
        }
    }
 
    // Return count
    return count;
}
 
// Driver code
    // Pre-compute Van Eck's sequence
    vanEckSequence();
 
    let n = 5;
 
    // Print count of the occurrence of nth
    // term in first n terms of the sequence
    console.log(getCount(n));
 
    n = 11;
 
    // Print count of the occurrence of nth
    // term in first n terms of the sequence
    console.log(getCount(n));


Output

1
5
  1. Efficient Approach:
    • For a given term in Van Eck’s sequence, its next term indicates the distance between last occurrence of the given term.
    • So, for ith term, its previous occurrence will be at i – value (i + 1)th term. For example:
    • Also, if the next term in the sequence is 0 then this means that the term has not occurred before. For example:
    • Algorithm:
      • Let us consider Nth term of the sequence as SN
      • If SN+1 is non-zero then increment the count and do the same for (N- SN+1)th term
      • And if SN+1 is zero then stop.

Below is the implementation of the above approach:

C++




// C++ program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
#include <bits/stdc++.h>
using namespace std;
 
#define MAX 100000
int sequence[MAX + 1];
 
// Utility function to compute
// Van Eck's sequence
void vanEckSequence()
{
 
    // Initialize sequence array
    for (int i = 0; i < MAX; i++) {
        sequence[i] = 0;
    }
 
    // Loop to generate sequence
    for (int i = 0; i < MAX; i++) {
 
        // Check if sequence[i] has occurred
        // previously or is new to sequence
        for (int j = i - 1; j >= 0; j--) {
            if (sequence[j] == sequence[i]) {
 
                // If occurrence found
                // then the next term will be
                // how far back this last term
                // occurred previously
                sequence[i + 1] = i - j;
                break;
            }
        }
    }
}
 
// Utility function to count
// the occurrence of nth term
// in first n terms of the sequence
int getCount(int n)
{
 
    // Initialize count as 1
    int count = 1;
 
    int i = n - 1;
 
    while (sequence[i + 1] != 0) {
 
        // Increment count if (i+1)th term
        // is non-zero
        count++;
 
        // Previous occurrence of sequence[i]
        // will be it (i - sequence[i+1])th position
        i = i - sequence[i + 1];
    }
 
    // Return the count of occurrence
    return count;
}
 
// Driver code
int main()
{
 
    // Pre-compute Van Eck's sequence
    vanEckSequence();
 
    int n = 5;
 
    // Print count of the occurrence of nth term
    // in first n terms of the sequence
    cout << getCount(n) << endl;
 
    n = 11;
 
    // Print count of the occurrence of nth term
    // in first n terms of the sequence
    cout << getCount(n) << endl;
 
    return 0;
}


Java




// Java program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
class GFG {
 
    static int MAX = 100000;
    static int sequence[] = new int[MAX + 1];
 
    // Utility function to compute
    // Van Eck's sequence
    static void vanEckSequence()
    {
 
        // Initialize sequence array
        for (int i = 0; i < MAX; i++) {
            sequence[i] = 0;
        }
 
        // Loop to generate sequence
        for (int i = 0; i < MAX; i++) {
 
            // Check if sequence[i] has occurred
            // previously or is new to sequence
            for (int j = i - 1; j >= 0; j--) {
                if (sequence[j] == sequence[i]) {
 
                    // If occurrence found
                    // then the next term will be
                    // how far back this last term
                    // occurred previously
                    sequence[i + 1] = i - j;
                    break;
                }
            }
        }
    }
 
    // Utility function to count
    // the occurrence of nth term
    // in first n terms of the sequence
    static int getCount(int n)
    {
 
        // Initialize count as 1
        int count = 1;
 
        int i = n - 1;
        while (sequence[i + 1] != 0) {
 
            // Increment count if (i+1)th term
            // is non-zero
            count++;
 
            // Previous occurrence of sequence[i]
            // will be it (i - sequence[i+1])th position
            i = i - sequence[i + 1];
        }
 
        // Return the count of occurrence
        return count;
    }
 
    // Driver code
    public static void main(String[] args)
    {
 
        // Pre-compute Van Eck's sequence
        vanEckSequence();
 
        int n = 5;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        System.out.println(getCount(n));
 
        n = 11;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        System.out.println(getCount(n));
    }
}


Python3




# Python3 program to count the occurrence
# of nth term in first n terms
# of Van Eck's sequence
MAX = 10000
sequence = [0] * (MAX + 1);
 
# Utility function to compute
# Van Eck's sequence
def vanEckSequence() :
 
    # Loop to generate sequence
    for i in range(MAX) :
 
        # Check if sequence[i] has occurred
        # previously or is new to sequence
        for j in range( i - 1, -1, -1) :
            if (sequence[j] == sequence[i]) :
                 
                # If occurrence found
                # then the next term will be
                # how far back this last term
                # occurred previously
                sequence[i + 1] = i - j;
                break;
 
# Utility function to count
# the occurrence of nth term
# in first n terms of the sequence
def getCount(n) :
 
    # Initialize count as 1
    count = 1;
 
    i = n - 1;
 
    while (sequence[i + 1] != 0) :
 
        # Increment count if (i+1)th term
        # is non-zero
        count += 1;
 
        # Previous occurrence of sequence[i]
        # will be it (i - sequence[i+1])th position
        i = i - sequence[i + 1];
 
    # Return the count of occurrence
    return count;
 
# Driver code
if __name__ == "__main__" :
 
    # Pre-compute Van Eck's sequence
    vanEckSequence();
 
    n = 5;
 
    # Print count of the occurrence of nth term
    # in first n terms of the sequence
    print(getCount(n));
 
    n = 11;
 
    # Print count of the occurrence of nth term
    # in first n terms of the sequence
    print(getCount(n)) ;
 
# This code is contributed by AnkitRai01


C#




// C# program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
using System;
class GFG {
 
    static int MAX = 100000;
    static int[] sequence = new int[MAX + 1];
 
    // Utility function to compute
    // Van Eck's sequence
    static void vanEckSequence()
    {
 
        // Initialize sequence array
        for (int i = 0; i < MAX; i++) {
            sequence[i] = 0;
        }
 
        // Loop to generate sequence
        for (int i = 0; i < MAX; i++) {
 
            // Check if sequence[i] has occurred
            // previously or is new to sequence
            for (int j = i - 1; j >= 0; j--) {
                if (sequence[j] == sequence[i]) {
 
                    // If occurrence found
                    // then the next term will be
                    // how far back this last term
                    // occurred previously
                    sequence[i + 1] = i - j;
                    break;
                }
            }
        }
    }
 
    // Utility function to count
    // the occurrence of nth term
    // in first n terms of the sequence
    static int getCount(int n)
    {
 
        // Initialize count as 1
        int count = 1;
        int i = n - 1;
 
        while (sequence[i + 1] != 0) {
 
            // Increment count if (i+1)th term
            // is non-zero
            count++;
 
            // Previous occurrence of sequence[i]
            // will be it (i - sequence[i+1])th position
            i = i - sequence[i + 1];
        }
 
        // Return the count of occurrence
        return count;
    }
 
    // Driver code
    public static void Main(string[] args)
    {
 
        // Pre-compute Van Eck's sequence
        vanEckSequence();
 
        int n = 5;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        Console.WriteLine(getCount(n));
 
        n = 11;
 
        // Print count of the occurrence of nth term
        // in first n terms of the sequence
        Console.WriteLine(getCount(n));
    }
}


Javascript




// JS program to count the occurrence
// of nth term in first n terms
// of Van Eck's sequence
 
let MAX = 100000;
let sequence = new Array(MAX + 1);
 
// Utility function to compute
// Van Eck's sequence
function vanEckSequence()
{
 
    // Initialize sequence array
    for (var i = 0; i < MAX; i++) {
        sequence[i] = 0;
    }
 
    // Loop to generate sequence
    for (var i = 0; i < MAX; i++) {
 
        // Check if sequence[i] has occurred
        // previously or is new to sequence
        for (var j = i - 1; j >= 0; j--) {
            if (sequence[j] == sequence[i]) {
 
                // If occurrence found
                // then the next term will be
                // how far back this last term
                // occurred previously
                sequence[i + 1] = i - j;
                break;
            }
        }
    }
}
 
// Utility function to count
// the occurrence of nth term
// in first n terms of the sequence
function getCount(n)
{
 
    // Initialize count as 1
    let count = 1;
    let i = n - 1;
 
    while (sequence[i + 1] != 0) {
 
        // Increment count if (i+1)th term
        // is non-zero
        count++;
 
        // Previous occurrence of sequence[i]
        // will be it (i - sequence[i+1])th position
        i = i - sequence[i + 1];
    }
 
    // Return the count of occurrence
    return count;
}
 
// Driver code
 
// Pre-compute Van Eck's sequence
vanEckSequence();
 
let n = 5;
 
// Print count of the occurrence of nth term
// in first n terms of the sequence
console.log(getCount(n));
 
n = 11;
 
// Print count of the occurrence of nth term
// in first n terms of the sequence
console.log(getCount(n));
 
// This code is contributed by phasing17


Output

1
5

Time Complexity: O(MAX*MAX)
Auxiliary Space: O(MAX)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Nicole Veronica Rubhabha
Nicole Veronica Rubhabha
A highly competent and organized individual DotNet developer with a track record of architecting and developing web client-server applications. Recognized as a personable, dedicated performer who demonstrates innovation, communication, and teamwork to ensure quality and timely project completion. Expertise in C#, ASP.Net, MVC, LINQ, EF 6, Web Services, SQL Server, MySql, Web development,
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments