найди число

Условие задачи

Условие

Даны два числа и . Найдите минимальное число такое, что оно делится на и имеет сумму цифр . или -1 если его не существует

Примеры

входные данныевыходные данные
13 50699998

Решение

Решение

Сделаем bfs по состояниям дп.

  1. — хранит минимальное в виде строки, которое имеет остаток от деление на и сумму цифр .
  2. Из текущего состояния мы переходим во все состояние если дописываем последнее число . Понятно, что и .
  3. ответ хранится в состояние .

Это не самое обычное .

Запустим обычный 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;
}