#include <vector>
#include <iostream>
using namespace std;
vector<int> tri; // Запас треуголтных чисел :)
long long total = 0; // Количество решений
vector<int> solution; // Вектор для решения
// Рекурсивный вызов, изначально - доступны все числа (k)
void getThree(int n, int k = tri.size()-1)
{
if (n==0) // Ура, найден!
{
++total;
// Если захотим вывести - раскомментировать
// for(auto i: solution) cout << i << " "; cout << endl;
return;
}
if (n < 0 || k < 0) return; // Тупик - решение не получилось
// Ветвь с использованием k-го числа
solution.push_back(tri[k]);
getThree(n-tri[k],k-1);
solution.pop_back();
// Ветвь без него
getThree(n,k-1);
}
int main(int argc, const char * argv[])
{
// Заполняем массив треугольными числами
for(int i = 1; i <= 64; ++i) tri.push_back(i*(i-1)/2);
// Приступаем...
getThree(2018);
cout << total << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxpbnQ+IHRyaTsgICAgICAvLyDQl9Cw0L/QsNGBINGC0YDQtdGD0LPQvtC70YLQvdGL0YUg0YfQuNGB0LXQuyA6KQpsb25nIGxvbmcgdG90YWwgPSAwOyAgLy8g0JrQvtC70LjRh9C10YHRgtCy0L4g0YDQtdGI0LXQvdC40LkKCnZlY3RvcjxpbnQ+IHNvbHV0aW9uOyAvLyDQktC10LrRgtC+0YAg0LTQu9GPINGA0LXRiNC10L3QuNGPCgovLyDQoNC10LrRg9GA0YHQuNCy0L3Ri9C5INCy0YvQt9C+0LIsINC40LfQvdCw0YfQsNC70YzQvdC+IC0g0LTQvtGB0YLRg9C/0L3RiyDQstGB0LUg0YfQuNGB0LvQsCAoaykKdm9pZCBnZXRUaHJlZShpbnQgbiwgaW50IGsgPSB0cmkuc2l6ZSgpLTEpCnsKICAgIGlmIChuPT0wKSAgLy8g0KPRgNCwLCDQvdCw0LnQtNC10L0hCiAgICB7CiAgICAgICAgKyt0b3RhbDsKICAgICAgICAvLyDQldGB0LvQuCDQt9Cw0YXQvtGC0LjQvCDQstGL0LLQtdGB0YLQuCAtINGA0LDRgdC60L7QvNC80LXQvdGC0LjRgNC+0LLQsNGC0YwKICAgICAgICAvLyBmb3IoYXV0byBpOiBzb2x1dGlvbikgY291dCA8PCBpIDw8ICIgIjsgY291dCA8PCBlbmRsOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAobiA8IDAgfHwgayA8IDApIHJldHVybjsgICAgLy8g0KLRg9C/0LjQuiAtINGA0LXRiNC10L3QuNC1INC90LUg0L/QvtC70YPRh9C40LvQvtGB0YwKCiAgICAvLyDQktC10YLQstGMINGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwgay3Qs9C+INGH0LjRgdC70LAKICAgIHNvbHV0aW9uLnB1c2hfYmFjayh0cmlba10pOwogICAgZ2V0VGhyZWUobi10cmlba10say0xKTsKICAgIHNvbHV0aW9uLnBvcF9iYWNrKCk7CgogICAgLy8g0JLQtdGC0LLRjCDQsdC10Lcg0L3QtdCz0L4KICAgIGdldFRocmVlKG4say0xKTsKfQoKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQp7CiAgICAvLyDQl9Cw0L/QvtC70L3Rj9C10Lwg0LzQsNGB0YHQuNCyINGC0YDQtdGD0LPQvtC70YzQvdGL0LzQuCDRh9C40YHQu9Cw0LzQuAogICAgZm9yKGludCBpID0gMTsgaSA8PSA2NDsgKytpKSB0cmkucHVzaF9iYWNrKGkqKGktMSkvMik7CgogICAgLy8g0J/RgNC40YHRgtGD0L/QsNC10LwuLi4KICAgIGdldFRocmVlKDIwMTgpOwogICAgY291dCA8PCB0b3RhbCA8PCBlbmRsOwp9Cgo=