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 = 30
Input: 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 2D array visited[][] that stores the visited digit.
 Insert Node into queue and check if queue is nonempty.
 While the queue is nonempty, 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 nonempty while pushing the nonvisited number to the queue.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int visited[501][5001];
struct Node {
int a, b;
string str;
};
int findNumber( int a, int b)
{
queue<Node> q;
Node temp = Node{ 0, 0, "" };
visited[0][0] = 1;
q.push(temp);
while (!q.empty()) {
Node u = q.front();
q.pop();
if (u.a == 0 && u.b == b)
return std::stoi(u.str);
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) });
}
}
}
return 1;
}
int main()
{
int a = 25, b = 1;
cout << findNumber(a, b);
return 0;
}

Java
import java.util.*;
class Solution
{
static int visited[][]= new int [ 501 ][ 5001 ];
static class Node {
int a, b;
String str;
Node( int a1, int b1,String s)
{
a=a1;
b=b1;
str=s;
}
}
static int findNumber( int a, int b)
{
Queue<Node> q= new LinkedList<Node>();
Node temp = new Node( 0 , 0 , "" );
visited[ 0 ][ 0 ] = 1 ;
q.add(temp);
while (q.size()!= 0 ) {
Node u = q.peek();
q.remove();
if (u.a == 0 && u.b == b)
return Integer.parseInt(u.str);
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) ));
}
}
}
return  1 ;
}
public static void main(String args[])
{
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));
}
}

Python3
# Python3 implementation of the approach
# Array that stores visited digits
visited = [[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
[tabbyending]