Divisible Numbers - Amazon Top Interview Questions


Problem Statement :


You are given integers n, a, b, and c. Return the nth (0-indexed) term of the sorted sequence of integers divisible by a, b or c.

Note that by convention the first term of any sequence always starts with 1.

Example 1

Input

n = 8
a = 2
b = 5
c = 7

Output

12

Explanation

The first 9 terms of the sequence are [1, 2, 4, 5, 6, 7, 8, 10, 12]



Solution :



title-img




                        Solution in C++ :

class Solution {
    public:
    int lcm(int x, int y) {
        return x * y / __gcd(x, y);
    }

    int a, b, c;

    int lesser(int n) {
        // how many elements less than it?
        return n / a + n / b + n / c - n / lcm(a, b) - n / lcm(b, c) - n / lcm(a, c) +
               n / lcm(a, lcm(b, c));
    }

    int solve(int n, int a, int b, int c) {
        this->a = a, this->b = b, this->c = c;

        int l = 1, r = INT_MAX;

        while (l < r) {
            int guess = l + (r - l) / 2;

            // i want the first value with >=n elements lesser than it!
            if (lesser(guess) >= n) {
                r = guess;
            } else {
                l = guess + 1;
                // guess is not the answer! +1 it
            }
        }

        return l;
    }
};

int solve(int n, int a, int b, int c) {
    return (new Solution())->solve(n, a, b, c);
}
                    


                        Solution in Java :

import java.util.*;

class Solution {
    public int solve(int n, int a, int b, int c) {
        int x = 1, y = 1, z = 1;
        int ans = 1;

        while (n-- > 0) {
            int xx = a * x;
            int yy = b * y;
            int zz = c * z;

            ans = Math.min(xx, Math.min(yy, zz));

            if (ans == xx) {
                x++;
            }

            if (ans == yy) {
                y++;
            }

            if (ans == zz) {
                z++;
            }
        }

        return ans;
    }
}
                    


                        Solution in Python : 
                            
class Solution:
    def find_points(self, goal, a, b, c, ab, ac, bc, abc):
        total = 0

        for item in (a, b, c, abc):
            total += goal // item

        for item in (ab, ac, bc):
            total -= goal // item

        return total

    def solve(self, n, a, b, c):

        if n == 0:
            return 1

        lcm_ab = a * b // gcd(a, b)
        lcm_ac = a * c // gcd(a, c)
        lcm_bc = b * c // gcd(b, c)
        lcm_abc = lcm_ab * c // gcd(lcm_ab, c)

        points = self.find_points(lcm_abc, a, b, c, lcm_ab, lcm_ac, lcm_bc, lcm_abc)
        total = n // points * lcm_abc

        if n % points == 0:
            return total

        goal = n % points

        approx = int(lcm_abc / points * goal)
        approx -= min(approx % a, approx % b, approx % c)
        calc = 0

        while calc != goal:
            calc = self.find_points(approx, a, b, c, lcm_ab, lcm_ac, lcm_bc, lcm_abc)

            if calc > goal:
                approx -= 1
                approx -= min(approx % a, approx % b, approx % c)
            if calc < goal:
                approx += min(a - approx % a, b - approx % b, c - approx % c)

        return total + approx
                    


View More Similar Problems

Tree: Preorder Traversal

Complete the preorder function in the editor below, which has 1 parameter: a pointer to the root of a binary tree. It must print the values in the tree's preorder traversal as a single line of space-separated values. Input Format Our test code passes the root node of a binary tree to the preOrder function. Constraints 1 <= Nodes in the tree <= 500 Output Format Print the tree's

View Solution →

Tree: Postorder Traversal

Complete the postorder function in the editor below. It received 1 parameter: a pointer to the root of a binary tree. It must print the values in the tree's postorder traversal as a single line of space-separated values. Input Format Our test code passes the root node of a binary tree to the postorder function. Constraints 1 <= Nodes in the tree <= 500 Output Format Print the

View Solution →

Tree: Inorder Traversal

In this challenge, you are required to implement inorder traversal of a tree. Complete the inorder function in your editor below, which has 1 parameter: a pointer to the root of a binary tree. It must print the values in the tree's inorder traversal as a single line of space-separated values. Input Format Our hidden tester code passes the root node of a binary tree to your $inOrder* func

View Solution →

Tree: Height of a Binary Tree

The height of a binary tree is the number of edges between the tree's root and its furthest leaf. For example, the following binary tree is of height : image Function Description Complete the getHeight or height function in the editor. It must return the height of a binary tree as an integer. getHeight or height has the following parameter(s): root: a reference to the root of a binary

View Solution →

Tree : Top View

Given a pointer to the root of a binary tree, print the top view of the binary tree. The tree as seen from the top the nodes, is called the top view of the tree. For example : 1 \ 2 \ 5 / \ 3 6 \ 4 Top View : 1 -> 2 -> 5 -> 6 Complete the function topView and print the resulting values on a single line separated by space.

View Solution →

Tree: Level Order Traversal

Given a pointer to the root of a binary tree, you need to print the level order traversal of this tree. In level-order traversal, nodes are visited level by level from left to right. Complete the function levelOrder and print the values in a single line separated by a space. For example: 1 \ 2 \ 5 / \ 3 6 \ 4 F

View Solution →