Редакция для Линейное уравнение
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Дано уравнение a * x + b = c, где a, b, c — целые числа. Нужно понять, какие целые x ему подходят.
Перенесём b в правую часть:
a * x = c - b
Обозначим d = c - b. Тогда задача сводится к уравнению:
a * x = d
Дальше остаётся разобрать два случая:
a = 0a != 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. Алгоритм
- Считать
a,b,c. - Вычислить
d = c - b. - Если
a == 0:- если
d == 0, вывестиINF; - иначе вывести
NO.
- если
- Иначе, если
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")
Комментарии