Find the minimum positive integer such that it is divisible by A and sum of its digits is equal to B

10 Aug, 2021
Given two integers A and B, the task is to find the minimum positive integer N such that N is divisible by A and the sum of the digits of N is equal to B. If number is not found then print -1.Examples:  
Input: A = 20, B = 30 Output: 49980 49980 is divisible by 20 and sum of its digit = 4 + 9 + 9 + 8 + 0 = 30Input: A = 5, B = 2 Output: 20  
 
Approach:  
Create empty queue q that stores the value of A and B and output number as a string and create integer type 2-D array visited[][] that stores the visited digit.
Insert Node into queue and check if queue is non-empty.
While the queue is non-empty, pop an element from the queue and for every digit from 1 to 9, concatenate the digit after the string num and check whether the number formed is the required number.
If the required number is found, print the number.
Else repeat the steps while the number is less than B and the queue is non-empty while pushing the non-visited number to the queue.
Below is the implementation of the above approach:  
C++
Java
Python3
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std; // Array that stores visited digitsint visited[501][5001]; // Structure for queue Node.struct Node {    int a, b;    string str;}; // Function to return the minimum number such that it is// divisible by 'a' and sum of its digits is equals to 'b'int findNumber(int a, int b){    // Create queue    queue<Node> q;     // Initially queue is empty    Node temp = Node{ 0, 0, "" };     // Initialize visited to 1    visited[0][0] = 1;     // Push temp in queue    q.push(temp);     // While queue is not empty    while (!q.empty()) {         // Get the front of the queue and pop it        Node u = q.front();        q.pop();         // If popped element is the required number        if (u.a == 0 && u.b == b)             // Parse int from string and return it            return std::stoi(u.str);         // Loop for each digit and check the sum        // If not visited then push it to the queue        for (int i = 0; i < 10; i++) {            int dd = (u.a * 10 + i) % a;            int ss = u.b + i;            if (ss <= b && !visited[dd][ss]) {                visited[dd][ss] = 1;                q.push(Node{ dd, ss, u.str + char('0' + i) });            }        }    }     // Required number not found return -1.    return -1;} // Driver code.int main(){    int a = 25, b = 1;    cout << findNumber(a, b);    return 0;}
// Java implementation of the approachimport java.util.*;class Solution{  // Array that stores visited digitsstatic int visited[][]= new int[501][5001];  // Structure for queue Node.static class Node {    int a, b;    String str;    Node(int a1,int b1,String s)    {        a=a1;        b=b1;        str=s;    }}  // Function to return the minimum number such that it is// divisible by 'a' and sum of its digits is equals to 'b'static int findNumber(int a, int b){    // Create queue    Queue<Node> q= new LinkedList<Node>();      // Initially queue is empty    Node temp =new  Node( 0, 0, "" );      // Initialize visited to 1    visited[0][0] = 1;      // Push temp in queue    q.add(temp);      // While queue is not empty    while (q.size()!=0) {          // Get the front of the queue and pop it        Node u = q.peek();        q.remove();          // If popped element is the required number        if (u.a == 0 && u.b == b)              // Parse int from string and return it            return Integer.parseInt(u.str);          // Loop for each digit and check the sum        // If not visited then push it to the queue        for (int i = 0; i < 10; i++) {            int dd = (u.a * 10 + i) % a;            int ss = u.b + i;            if (ss <= b && visited[dd][ss]==0) {                visited[dd][ss] = 1;                q.add(new Node( dd, ss, u.str + (char)('0' + i) ));            }        }    }      // Required number not found return -1.    return -1;}  // Driver code.public static void  main(String args[]){    //initialize visited    for(int i=0;i<500;i++)        for(int j=0;j<500;j++)            visited[i][j]=0;         int a = 25, b = 1;    System.out.println(findNumber(a, b));     }}//contributed by Arnab Kundu
# Python3 implementation of the approach # Array that stores visited digitsvisited = [[0 for x in range(501)]              for y in range(5001)] # Structure for queue Node.class Node:         def __init__(self, a, b, string):        self.a = a        self.b = b        self.string = string # Function to return the minimum number# such that it is divisible by 'a' and# sum of its digits is equals to 'b'def findNumber(a, b):     # Use list as queue    q = []     # Initially queue is empty    temp = Node(0, 0, "")     # Initialize visited to 1    visited[0][0] = 1     # Push temp in queue    q.append(temp)     # While queue is not empty    while len(q) > 0:         # Get the front of the queue        # and pop it        u = q.pop(0)         # If popped element is the        # required number        if u.a == 0 and u.b == b:             # Parse int from string            # and return it            return int(u.string)         # Loop for each digit and check the sum        # If not visited then push it to the queue        for i in range(0, 10):            dd = (u.a * 10 + i) % a            ss = u.b + i                         if ss <= b and visited[dd][ss] == False:                visited[dd][ss] = 1                q.append(Node(dd, ss, u.string + str(i)))     # Required number not found return -1.    return -1 # Driver code.if __name__ == "__main__":     a, b = 25, 1    print(findNumber(a, b))     # This code is contributed by Rituraj Jain
<script>// Javascript implementation of the approach // Array that stores visited digitslet visited=new Array(501);for(let i = 0; i < 501; i++){    visited[i] = new Array(5001);    for(let j = 0; j < 5001; j++)        visited[i][j] = 0;} // Structure for queue Node.class Node{    constructor(a1, b1, s)    {        this.a = a1;        this.b = b1;        this.str = s;    }} // Function to return the minimum number such that it is// divisible by 'a' and sum of its digits is equals to 'b'function findNumber(a,b){    // Create queue    let q= [];       // Initially queue is empty    let temp = new  Node( 0, 0, "" );       // Initialize visited to 1    visited[0][0] = 1;       // Push temp in queue    q.push(temp);       // While queue is not empty    while (q.length != 0) {           // Get the front of the queue and pop it        let u = q[0];        q.shift();           // If popped element is the required number        if (u.a == 0 && u.b == b)               // Parse int from string and return it            return parseInt(u.str);           // Loop for each digit and check the sum        // If not visited then push it to the queue        for (let i = 0; i < 10; i++) {            let dd = (u.a * 10 + i) % a;            let ss = u.b + i;            if (ss <= b && visited[dd][ss] == 0) {                visited[dd][ss] = 1;                q.push(new Node( dd, ss, u.str + String.fromCharCode('0'.charCodeAt(0) + i) ));            }        }    }       // Required number not found return -1.    return -1;} // Driver code.let a = 25, b = 1;document.write(findNumber(a, b)); // This code is contributed by avanitrachhadiya2155</script>
100
 
Time Complexity: O(N)Auxiliary Space: O(N)
andrew1234
rituraj_jain
arorakashish0911
pankajsharmagfg
avanitrachhadiya2155
cpp-queue
Numbers
Algorithms
Competitive Programming
Data Structures
Data Structures
Numbers
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
What is Hashing | A Complete Tutorial
Find if there is a path between two vertices in an undirected graph
How to Start Learning DSA?
Complete Roadmap To Learn DSA From Scratch
Types of Complexity Classes | P, NP, CoNP, NP hard and NP complete
Competitive Programming - A Complete Guide
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Modulo 10^9+7 (1000000007)
Prefix Sum Array - Implementation and Applications in Competitive Programming