# 1999. Smallest Greater Multiple Made of Two Digits

## Description

Given three integers, k, digit1, and digit2, you want to find the smallest integer that is:

• Larger than k,
• A multiple of k, and
• Comprised of only the digits digit1 and/or digit2.

Return the smallest such integer. If no such integer exists or the integer exceeds the limit of a signed 32-bit integer (231 - 1), return -1.

Example 1:

Input: k = 2, digit1 = 0, digit2 = 2
Output: 20
Explanation:
20 is the first integer larger than 2, a multiple of 2, and comprised of only the digits 0 and/or 2.


Example 2:

Input: k = 3, digit1 = 4, digit2 = 2
Output: 24
Explanation:
24 is the first integer larger than 3, a multiple of 3, and comprised of only the digits 4 and/or 2.


Example 3:

Input: k = 2, digit1 = 0, digit2 = 0
Output: -1
Explanation:
No integer meets the requirements so return -1.


Constraints:

• 1 <= k <= 1000
• 0 <= digit1 <= 9
• 0 <= digit2 <= 9

## Solutions

• class Solution {
public int findInteger(int k, int digit1, int digit2) {
if (digit1 == 0 && digit2 == 0) {
return -1;
}
if (digit1 > digit2) {
return findInteger(k, digit2, digit1);
}
Deque<Long> q = new ArrayDeque<>();
q.offer(0L);
while (true) {
long x = q.poll();
if (x > Integer.MAX_VALUE) {
return -1;
}
if (x > k && x % k == 0) {
return (int) x;
}
q.offer(x * 10 + digit1);
if (digit1 != digit2) {
q.offer(x * 10 + digit2);
}
}
}
}

• class Solution {
public:
int findInteger(int k, int digit1, int digit2) {
if (digit1 == 0 && digit2 == 0) {
return -1;
}
if (digit1 > digit2) {
swap(digit1, digit2);
}
queue<long long> q{ {0} };
while (1) {
long long x = q.front();
q.pop();
if (x > INT_MAX) {
return -1;
}
if (x > k && x % k == 0) {
return x;
}
q.emplace(x * 10 + digit1);
if (digit1 != digit2) {
q.emplace(x * 10 + digit2);
}
}
}
};

• class Solution:
def findInteger(self, k: int, digit1: int, digit2: int) -> int:
if digit1 == 0 and digit2 == 0:
return -1
if digit1 > digit2:
return self.findInteger(k, digit2, digit1)
q = deque([0])
while 1:
x = q.popleft()
if x > 2**31 - 1:
return -1
if x > k and x % k == 0:
return x
q.append(x * 10 + digit1)
if digit1 != digit2:
q.append(x * 10 + digit2)


• func findInteger(k int, digit1 int, digit2 int) int {
if digit1 == 0 && digit2 == 0 {
return -1
}
if digit1 > digit2 {
digit1, digit2 = digit2, digit1
}
q := []int{0}
for {
x := q[0]
q = q[1:]
if x > math.MaxInt32 {
return -1
}
if x > k && x%k == 0 {
return x
}
q = append(q, x*10+digit1)
if digit1 != digit2 {
q = append(q, x*10+digit2)
}
}
}