Number from a given range that requires Kth smallest number of steps to get reduced to 1
Given three positive integers L, R, and K, the task is to find the number from the range [L, R] which requires Kth smallest number of steps to be reduced to 1 by performing the following operations:
- If X is even, then reduce X to X/2.
- Otherwise, set X = (3*X + 1).
Examples:
Input: L = 7, R = 10, K = 4
Output: 9
Explanation:
Count of steps for all the numbers from the range [7, 10] are as follows:
- The number of steps required for 7 is 16. {7 -> 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 > 1}
- Similarly, the number of steps required for 8 is 3.
- Similarly, the number of steps required for 9 is 19.
- Similarly, the number of steps required for 10 is 6.
Therefore, the number of steps required for all the values from the given range, sorted in ascending order, are {3, 6, 16, 19} for values {8, 10, 7, 9} respectively. Therefore, the Kth smallest number of steps is required for the number 9.
Input: L = 7, R = 10, K = 2
Output: 10
Approach: The idea is to make separate functions to calculate the number of steps for each number from the range and print the Kth smallest of the values obtained. Follow the steps below to solve the problem:
- Define a function power_value () to calculate the number of steps required for a number:
- Base condition: If the number is 1, return 0.
- If the number is even, then call the function power_value() with value number/2.
- Otherwise, call the function power_value() with value number * 3 + 1.
- Now, for finding the Kth smallest number of steps, perform the following steps:
- After completing the above steps, print the Kth smallest count of steps from start, i.e. ans[K – 1].second as the result.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
vector<ll> v(1000000, -1);
ll power_value(ll val)
{
if (val == 1)
return 0;
if (val % 2 == 0) {
v[val] = power_value(val / 2) + 1;
return v[val];
}
else {
ll temp = val * 3;
temp++;
v[val] = power_value(temp) + 1;
return v[val];
}
}
ll getKthNumber( int l, int r, int k)
{
vector<pair<ll, ll> > ans;
for (ll i = l; i <= r; i++) {
if (v[i] == -1)
power_value(i);
}
ll j = 0;
for (ll i = l; i <= r; i++) {
ans.push_back(make_pair(v[i], i));
j++;
}
sort(ans.begin(), ans.end());
cout << ans[k - 1].second;
}
int main()
{
int L = 7, R = 10, K = 4;
getKthNumber(L, R, K);
return 0;
}
|
Java
import java.util.*;
class GFG {
static long v[] = new long [ 1000001 ];
static long powerValue( long val)
{
if (val == 1 ) {
return 0 ;
}
if (val % 2 == 0 ) {
v[( int )val] = powerValue(( int )(val / 2 )) + 1 ;
return v[( int )val];
}
else {
long temp = val * 3 ;
temp += 1 ;
v[( int )val] = powerValue(temp) + 1 ;
return v[( int )val];
}
}
static void getKthNumber( long l, long r, int k)
{
ArrayList< long []> ans = new ArrayList< long []>();
Arrays.fill(v, - 1 );
for ( long i = l; i <= r; i++) {
if (v[( int )i] == - 1 ) {
v[( int )i] = powerValue(i);
}
}
long j = 0 ;
for ( long i = l; i <= r; i++) {
long [] arr = { v[( int )j], i };
ans.add(arr);
j += 1 ;
}
Collections.sort(
ans, (a, b) -> Long.compare(a[ 0 ], b[ 0 ]));
System.out.println(ans.get(k - 1 )[ 1 ]);
}
public static void main(String[] args)
{
long L = 7 , R = 10 ;
int K = 4 ;
getKthNumber(L, R, K);
}
}
|
Python3
v = [ - 1 ] * ( 1000000 )
def power_value(val):
if (val = = 1 ):
return 0
if (val % 2 = = 0 ):
v[val] = power_value(val / / 2 ) + 1
return v[val]
else :
temp = val * 3
temp + = 1
v[val] = power_value(temp) + 1
return v[val]
def getKthNumber(l, r, k):
ans = []
for i in range (l, r + 1 ):
if (v[i] = = - 1 ):
power_value(i)
j = 0
for i in range (l, r + 1 ):
ans.append([v[i], i])
j + = 1
ans = sorted (ans)
print (ans[k - 1 ][ 1 ])
if __name__ = = '__main__' :
L,R,K = 7 , 10 , 4
getKthNumber(L, R, K)
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static long [] v = Enumerable.Repeat(-1L, 1000000).ToArray();
static long powerValue( long val)
{
if (val == 1)
{
return 0;
}
if (val % 2 == 0)
{
v[val] = powerValue(( int )(val / 2)) + 1;
return v[val];
}
else
{
long temp = val * 3;
temp += 1;
v[val] = powerValue(temp) + 1;
return v[val];
}
}
static void getKthNumber( long l, long r, long k)
{
List< long []> ans = new List< long []>();
for ( long i = l; i <= r; i++)
{
if (v[i] == -1)
{
v[i] = powerValue(i);
}
}
long j = 0;
for ( long i = l; i <= r; i++)
{
ans.Add( new long [] { v[i], i });
j += 1;
}
ans.Sort((a, b) => ( int )(a[0] - b[0]));
Console.WriteLine(ans[( int )k - 1][1]);
}
static void Main( string [] args)
{
long L = 7, R = 10, K = 4;
getKthNumber(L, R, K);
}
}
|
Javascript
let v = new Array(1000000).fill(-1);
function powerValue(val) {
if (val === 1) {
return 0;
}
if (val % 2 === 0) {
v[val] = powerValue(val / 2) + 1;
return v[val];
}
else {
let temp = val * 3;
temp += 1;
v[val] = powerValue(temp) + 1;
return v[val];
}
}
function getKthNumber(l, r, k) {
let ans = [];
for (let i = l; i <= r; i++) {
if (v[i] === -1) {
powerValue(i);
}
}
let j = 0;
for (let i = l; i <= r; i++) {
ans.push([v[i], i]);
j += 1;
}
ans.sort((a, b) => a[0] - b[0]);
console.log(ans[k - 1][1]);
}
( function () {
let L = 7;
let R = 10;
let K = 4;
getKthNumber(L, R, K);
})();
|
Time Complexity: O(N*log N)
Auxiliary Space: O(N)
Last Updated :
04 Jan, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...