В соревновании по программированию проблема заключалась в следующем:
Подсчитайте все решения уравнения:
x + 4y + 4z = n
. Вам будет даноn
, и вы определите количество решений. Предположим, что x, y и z — положительные целые числа.
Я рассматривал возможность использования тройных циклов for (грубая сила), но это было неэффективно, что привело к ПРЕВЫШЕНИЮ TIME LIMIT. (поскольку n может быть = 1000 000):
int sol = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n / 4; j++)
{
for (int k = 1; k <= n / 4; k++)
{
if (i + 4 * j + 4 * k == n)
sol++;
}
}
}
Мой друг смог решить проблему. Когда я спросил его, он сказал, что вообще не применял грубую силу. Вместо этого он преобразовал уравнение в «ряд» (то есть саммит). Я попросил его рассказать, как мне, но он отказался :)
Могу я узнать как?