найди число
Условие
Даны два числа и . Найдите минимальное число такое, что оно делится на и имеет сумму цифр . или -1 если его не существует
Примеры
входные данные | выходные данные |
---|---|
13 50 | 699998 |
Решение
Решение
Сделаем bfs по состояниям дп.
- — хранит минимальное в виде строки, которое имеет остаток от деление на и сумму цифр .
- Из текущего состояния мы переходим во все состояние если дописываем последнее число . Понятно, что и .
- ответ хранится в состояние .
Это не самое обычное .
Запустим обычный bfs из состояния . Максимально состояний у нас , так как состояния, для которых мы не рассматриваем. Получается ДП только считаем мы тут не последовательно, а вширь используя BFS.
Дополнительно прямо в очереди можно хранить числа вместе с состояниями.
void solve() {
int k, s;
cin >> k >> s;
queue<pair<pair<int, int>, string>> q; // {{mod, sum}, string}
vector<vector<bool>> used(k, vector<bool>(s + 1, false));
used[0][0] = true;
q.push({{0, 0}, ""});
while (!q.empty()) {
int mod = q.front().first.first;
int sum = q.front().first.second;
string num = q.front().second;
q.pop();
if (sum > s) continue;
if (mod == 0 && sum == s) {
cout << num;
return;
}
for (int i = 0; i < 10; i++) {
int mod_ = (mod * 10 + i) % k;
int sum_ = sum + i;
if (sum_ > s) continue;
if (!used[mod_][sum_]) {
used[mod_][sum_] = true;
q.push({{mod_, sum_}, num + (char)(i + '0')});
}
}
}
cout << -1;
}