Здравствуй, сообщество Кодфорсес! В прошлом году я участвовал в олимпиаде, которую проводил МУИТ (Международная олимпиада по спортивному программированию среди учащихся 10-11 классов). Там попалась интересная задача, которую так никто и не решил.
Вот собственно и задача:
Даны 2 числа a и b и уравнение (a / x) + (b / y) = 1, где |a|, |b| <= 10^14. Нужно найти количество целочисленных решений этого уравнения.
Архив соревнования здесь. Каковы идеи решения?
. Значит, если a·y делится на y - b, то для этого y существует x, и наоборот. Условие a·y делится на y - b равносильно тому, что a·y - a·(y - b) делится на y - b, т.е. a·b делится на y - b. Значит, ответ к задаче — это количество делителей числа a·b, которое можно найти, факторизовав a и b за .
Да, то же самое, только надо еще не умножать и не делить на 0 и проверять отрицательные делители a*b.
Я не совсем понял последний логический переход. Почему это так? Можно поподробней?
Рассматриваем случай a!=0 и b!=0, иначе решений бесконечно много, например: x=a и любой целый y при b=0.
Собственно если выразить X через Y, то получим X=a*y / (y-b). Разделим числитель и знаменатель дроби на y, получим: a/(1-b/y), откуда следует что a делится на (1-b/y) и b делится на y <=> y — делитель b. Положительные делители b мы можем перебрать за О(sqrt(b)), параллельно с их проверкой проверяем отрицательные значения. Таким образом мы найдем все решения вида c + z = 1, где c=a/x, z=b/y и c,z — целые.
Но могут быть еще и дробные варианты, т.е. a/x и b/y — не целые. Каждую из дробей a/x и b/y можно сократить на любой общий делитель a и b. Перебирая делители b мы также найдем общие делители с a, тогда получим все дробные уравнения вида p/x + q/y = 1, которые имеют до 2-ух интересующих нас решений:
пусть d — положительный общий делитель a и b.
Почему уравнение p/x + q/y = 1 имеет именно эти 4 решения?
вроде бы даже не 4, а 2. пусть d — положительный общий делитель a и b.
так будет правильней, иначе мы решения переберем несколько раз.
Вот так уже более ясно
пусть k — некоторый (возможно, отрицательный) делитель ab
осталось выкинуть нули и проверить случай x = a решение
До какого значения надо перебирать к в вашем решении?
k не надо перебирать. Количество (в т.ч. отрицательных) делителей можно посчитать, факторизовав a и b. Остается посчитать, что мы учитываем лишнее — это делается явными проверками.
Почти понял. Теперь бы реализовать и не за ТЛ-ить