Dragon#16

Dragon (Editorial)

Пояснення

Позначимо:

Отримуємо систему рівнянь:

x + K \cdot y = A
S \cdot x + N \cdot y = B

З першого рівняння виразимо :

x = A - K \cdot y

Підставляємо у друге рівняння:

S \cdot (A - K \cdot y) + N \cdot y = B
S \cdot A - S \cdot K \cdot y + N \cdot y = B
y \cdot (N - S \cdot K) = B - S \cdot A

Якщо B - S \cdot A = 0, то N = S \cdot K (будь-яке y \geq 1 підходить)

Якщо B - S \cdot A \neq 0, то:

N = \frac{B - S \cdot A}{y} + S \cdot K

Алгоритм

  1. Перебираємо значення від 1 до нескінченності, поки задовільняється умова задачі

  2. Для кожного обчислюємо x = A - K \cdot y

  3. Перевіряємо, що x \geq 1 (має бути хоча б одна S-ніжка)

  4. Обчислюємо N = \frac{B - x \cdot S}{y}

  5. Перевіряємо, що ціле і невідʼємне (так, можуть бути дракони без ніг)

  6. Виводимо знайдене

Якщо жодне не дає коректного розв'язку, виводимо .

Складність за часом:

Реалізація

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int s, k, a, b;
    cin >> s >> k >> a >> b;

    int y = 1;
    int x = a - k * y;
    while (x >= 1)
    {
        int n = b - x * s;
        if (n >= 0 && n % y == 0)
        {
            cout << n / y << endl;
            return 0;
        }
        ++y;
        x = a - k * y;
    }

    cout << -1 << endl;
}