Редакция для Линейное уравнение


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Автор: montes332

1. Идея

Дано уравнение a * x + b = c, где a, b, c — целые числа. Нужно понять, какие целые x ему подходят.

Перенесём b в правую часть:

a * x = c - b

Обозначим d = c - b. Тогда задача сводится к уравнению:

a * x = d

Дальше остаётся разобрать два случая:

  • a = 0
  • a != 0

Именно от этого зависит, будет ли решений бесконечно много, не будет вовсе, или решение одно.


2. Наблюдения

1. Если a = 0

Тогда левая часть уравнения не зависит от x, потому что 0 * x = 0.

Исходное уравнение превращается в:

b = c

или, после переноса:

0 * x = d

Здесь возможны два варианта:

  • если d = 0, то получаем 0 * x = 0, это верно при любом целом x, значит ответ INF;
  • если d != 0, то получаем 0 * x = d, а это невозможно, значит ответ NO.

2. Если a != 0

Тогда уравнение a * x = d имеет единственное вещественное решение x = d / a.

Но нам нужны именно целые решения. Значит надо проверить, делится ли d на a без остатка:

  • если d % a == 0, то целое решение существует и равно d / a;
  • иначе целых решений нет, ответ NO.

3. Почему не бывает нескольких разных целых решений при a != 0

Если a != 0, то линейное уравнение первой степени задаёт только одно значение x. Поэтому либо есть ровно одно целое решение, либо нет ни одного.


3. Алгоритм

  1. Считать a, b, c.
  2. Вычислить d = c - b.
  3. Если a == 0:
    • если d == 0, вывести INF;
    • иначе вывести NO.
  4. Иначе, если a != 0:
    • если d % a == 0, вывести d / a;
    • иначе вывести NO.

4. Почему это работает

Докажем корректность по случаям.

Пусть дано уравнение a * x + b = c. Переносим b вправо и получаем эквивалентное уравнение a * x = c - b. Обозначим d = c - b.

Случай 1: a = 0

Тогда уравнение имеет вид 0 * x = d.

  • Если d = 0, то это равенство 0 = 0, которое верно при любом целом x. Значит подходит бесконечно много значений, и вывод INF правильный.
  • Если d != 0, то получаем 0 = d, что ложно. Значит решений нет, и вывод NO правильный.

Случай 2: a != 0

Тогда из a * x = d следует x = d / a.

  • Если d делится на a без остатка, то x — целое число. Оно единственное, потому что при фиксированных a и d другое значение x равенство удовлетворять не может.
  • Если d не делится на a, то d / a не является целым, а других значений x быть не может. Значит целых решений нет, и ответ NO.

Таким образом, алгоритм во всех случаях выводит ровно то, что требуется в условии.


5. Сложность

Алгоритм выполняет только несколько арифметических операций и проверок.

  • Время: O(1)
  • Память: O(1)

6. Код на C++17

#include <iostream>

using namespace std;

int main() {
    long long a, b, c;
    cin >> a >> b >> c;

    long long d = c - b;

    if (a == 0) {
        if (d == 0) {
            cout << "INF\n";
        } else {
            cout << "NO\n";
        }
    } else {
        if (d % a == 0) {
            cout << d / a << "\n";
        } else {
            cout << "NO\n";
        }
    }

    return 0;
}

7. Код на Python 3

a, b, c = map(int, input().split())

d = c - b

if a == 0:
    if d == 0:
        print("INF")
    else:
        print("NO")
else:
    if d % a == 0:
        print(d // a)
    else:
        print("NO")

Комментарии

Еще нет ни одного комментария.