Open In App

Index of the array which would be visited in Kth operation

Given an array A[] of length N such that A[i] = i for all indices. Also, given two integers K and X. The task is to find the index of the array that would be visited in Kth operation. Considering the 0th index visited in first operation, the operation for visiting the rest of the indices which is to be performed (N-1) times is:

Examples :



Input: N=4, A={0, 1, 2, 3}, X=2, K=4
Output: 3
Explanation: In 1st operation, index 0 is visited. 
In operation 2, as 0 is the index visited last time. So, L=0 and hence j = (0+2)%4 = 2. Since index 2 was not visited before. Mark it as visited. 
In 3rd operation, j = (2+2)%4 = 0. Since 0th index is already visited, we update j as (0+1)%4 = 1. We mark 1 as visited.
In 4th operation, j = (1+2)%4 = 3. Mark 3rd index as visited. So, after 3 operations 3rd index would be visited.

Input: N=8, A={0, 1, 2, 3, 4, 5, 6, 7}, X = 8, K = 5
Output:  4



Naive Approach:

A simple approach to solve the problem would be to keep performing the operation as said in the problem.

Time Complexity: O(N)
Auxiliary Space: O(1)

Efficient Approach:

The problem can be solved based on the following observation:

Let X and Y be 2 positive integers having their gcd Z. Let X = xZ and Y=yZ. Then the integers Y%X, 2Y%X … (x-1)Y%X contain 0, Z, 2Z…(x-1)Z each exactly once. For example consider X=12 and Y = 9, Z = 3 and z = 4, y = 3. So, 0, Y%X, 2Y%X, 3Y%X are 0, 9, 6 and 3. i.e. it can be seen all multiples of Z between 0 and X have occurred exactly once.

Hence it can be seen:

  • The index that would be visited in ith operation  = (i-1)X%N. 
  • The index that would be visited in (x+i)th operation  = 1+((i-1)X%N)
  • Following the same pattern, Kth index to be visited would be (K-1)/x + ((K-1)X%N). (x is the number of multiples of gcd of X and N from 0 to N).

Following are the steps for the above approach:

Below is the implementation of the above approach.




// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
#define ll long long
 
// Function to Find index of the array which
// would be visited in K-th operation
ll solve(ll N, ll A[], ll K, ll X)
{
    // Reducing the value of K by 1, as
    // 1st operation is alrady done i.e. 0th
    // index is already visited
    K--;
 
    // Computing gcd of N and X
    ll gcd = __gcd(N, X);
 
    // Calculating the answer using the derived
    // formula
    ll x = N / gcd;
    ll answer = (long long)X * K % N + K / x;
 
    // Returning the answer
    return answer;
}
 
// Driver code
int main()
{
    ll N = 4, X = 2, K = 4;
    ll A[] = { 0, 1, 2, 3 };
 
    // Function call
    ll answer = solve(N, A, K, X);
    cout << answer << endl;
    return 0;
}




import java.util.*;
 
public class Main {
    static long solve(long N, long[] A, long K, long X) {
        // Reducing the value of K by 1, as
        // 1st operation is already done i.e. 0th
        // index is already visited
        K--;
 
        // Computing gcd of N and X
        long gcd = gcd(N, X);
 
        // Calculating the answer using the derived
        // formula
        long x = N / gcd;
        long answer = (long) (X * K % N + K / x);
 
        // Returning the answer
        return answer;
    }
 
    static long gcd(long a, long b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }
 
    public static void main(String[] args) {
        long N = 4, X = 2, K = 4;
        long[] A = { 0, 1, 2, 3 };
 
        // Function call
        long answer = solve(N, A, K, X);
        System.out.println(answer);
    }
}
//contributed by tushar rokade




import math
 
# Function to Find index of the array which
# would be visited in K-th operation
 
 
def solve(N, A, K, X):
    # Reducing the value of K by 1, as
    # 1st operation is alrady done i.e. 0th
    # index is already visited
    K -= 1
 
    # Computing gcd of N and X
    gcd = math.gcd(N, X)
 
    # Calculating the answer using the derived
    # formula
    x = N // gcd
    answer = (X * K % N) + (K // x)
 
    # Returning the answer
    return answer
 
 
# Driver code
N = 4
X = 2
K = 4
A = [0, 1, 2, 3]
 
# Function call
answer = solve(N, A, K, X)
print(answer)




using System;
 
class GFG {
    // Function to find index of the array which would be
    // visited in K-th operation
    static long Solve(long N, long[] A, long K, long X)
    {
        // Reducing the value of K by 1, as 1st operation is
        // already done i.e. 0th index is already visited
        K--;
 
        // Computing gcd of N and X
        long gcd = GCD(N, X);
 
        // Calculating the answer using the derived formula
        long x = N / gcd;
        long answer = (X * K % N + K / x);
 
        // Returning the answer
        return answer;
    }
 
    // Function to compute the Greatest Common Divisor (GCD)
    // of two numbers
    static long GCD(long a, long b)
    {
        if (b == 0)
            return a;
        return GCD(b, a % b);
    }
 
    static void Main(string[] args)
    {
        long N = 4, X = 2, K = 4;
        long[] A = { 0, 1, 2, 3 };
 
        // Function call
        long answer = Solve(N, A, K, X);
        Console.WriteLine(answer);
    }
}
 
// This code is contributed by rambabuguphka




// Function to Find index of the array which
// would be visited in K-th operation
function solve(N, A, K, X) {
    // Reducing the value of K by 1, as
    // 1st operation is already done i.e. 0th
    // index is already visited
    K--;
 
    // Computing gcd of N and X
    function gcd(a, b) {
        if (b === 0) return a;
        return gcd(b, a % b);
    }
 
    let gcdValue = gcd(N, X);
 
    // Calculating the answer using the derived formula
    let x = N / gcdValue;
    let answer = (X * K) % N + Math.floor(K / x);
 
    // Returning the answer
    return answer;
}
 
// Driver code
    let N = 4;
    let X = 2;
    let K = 4;
    let A = [0, 1, 2, 3];
 
    // Function call
    let answer = solve(N, A, K, X);
    console.log(answer);

Output
3



Time Complexity : O(log(min(X, N)))
Auxiliary Space : O(1)


Article Tags :