#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <numeric>
std::vector<int> num2vec(int n) {
std::vector<int> v = {100, 10};
std::vector<int> u = {0, 0, 0, 0, 0};
int y;
for (auto k : v) {
if (n > 999) {
u[0] = 1000;
break;
}
if (n < 20) {
u[3] = n;
} else if (n > 99) {
y = n % k;
if (y == 0) {
u[0] = n / k; u[1] = k;
break;
} else {
u[0] = n / k; u[1] = k; u[2] = -1;
n = y;
}
} else {
u[3] = (n / k) * k; u[4] = n % k;
}
}
return u;
}
std::string convert(std::vector<int> vec, std::map<int, std::string> t) {
std::string str = "";
for (auto& v : vec) {
str += t.at(v);
}
return str;
}
int euler_17(int n, std::map<int, std::string> t) {
int acc = 0;
for (int i = 0; i <= n; i++) {
acc += convert(num2vec(i), t).length();
}
return acc;
}
int main(void) {
std::map<int, std::string> table;
std::vector<std::pair<int, std::string>> vec =
{{-1, "and"},
{0, ""}, {1, "one"}, {2, "two"}, {3, "three"}, {4, "four"},
{5, "five"}, {6, "six"}, {7, "seven"}, {8, "eight"}, {9, "nine"},
{10, "ten"}, {11, "eleven"}, {12, "twelve"}, {13, "thirteen"}, {14, "fourteen"},
{15, "fifteen"}, {16, "sixteen"}, {17, "seventeen"}, {18, "eighteen"}, {19, "nineteen"},
{20, "twenty"}, {30, "thirty"}, {40, "forty"}, {50, "fifty"}, {60, "sixty"}, // if (n > 999) {
// u[0] = 1000;
// break;
// }
{70, "seventy"}, {80, "eighty"}, {90, "ninety"}, {100, "hundred"}, {1000, "onethousand"}};
for (auto d : vec) {
table.insert(d);
}
std::cout << euler_17(1000, table) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KCnN0ZDo6dmVjdG9yPGludD4gbnVtMnZlYyhpbnQgbikgewogIHN0ZDo6dmVjdG9yPGludD4gdiA9IHsxMDAsIDEwfTsKICBzdGQ6OnZlY3RvcjxpbnQ+IHUgPSB7MCwgMCwgMCwgMCwgMH07CiAgaW50IHk7CiAgZm9yIChhdXRvIGsgOiB2KSB7CiAgICBpZiAobiA+IDk5OSkgewogICAgICB1WzBdID0gMTAwMDsKICAgICAgYnJlYWs7CiAgICAgICB9CiAgaWYgKG4gPCAyMCkgewogICAgICB1WzNdID0gbjsKICAgIH0gZWxzZSBpZiAobiA+IDk5KSB7CiAgICAgIHkgPSBuICUgazsKICAgICAgaWYgKHkgPT0gMCkgewogICAgICAgIHVbMF0gPSBuIC8gazsgdVsxXSA9IGs7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdVswXSA9IG4gLyBrOyB1WzFdID0gazsgdVsyXSA9IC0xOwogICAgICAgIG4gPSB5OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB1WzNdID0gKG4gLyBrKSAqIGs7IHVbNF0gPSBuICUgazsKICAgIH0KICB9CiAgcmV0dXJuIHU7Cn0KCnN0ZDo6c3RyaW5nIGNvbnZlcnQoc3RkOjp2ZWN0b3I8aW50PiB2ZWMsIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IHQpIHsKICBzdGQ6OnN0cmluZyBzdHIgPSAiIjsKICBmb3IgKGF1dG8mIHYgOiB2ZWMpIHsKICAgIHN0ciArPSB0LmF0KHYpOwogIH0KICByZXR1cm4gc3RyOwp9CgppbnQgZXVsZXJfMTcoaW50IG4sIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IHQpIHsKICBpbnQgYWNjID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKICAgIGFjYyArPSBjb252ZXJ0KG51bTJ2ZWMoaSksIHQpLmxlbmd0aCgpOwogIH0KICByZXR1cm4gYWNjOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gdGFibGU7CiAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgc3RkOjpzdHJpbmc+PiB2ZWMgPQogICAge3stMSwgImFuZCJ9LAogICAgIHswLCAiIn0sIHsxLCAib25lIn0sIHsyLCAidHdvIn0sIHszLCAidGhyZWUifSwgezQsICJmb3VyIn0sCiAgICAgezUsICJmaXZlIn0sIHs2LCAic2l4In0sIHs3LCAic2V2ZW4ifSwgezgsICJlaWdodCJ9LCB7OSwgIm5pbmUifSwKICAgICB7MTAsICJ0ZW4ifSwgezExLCAiZWxldmVuIn0sIHsxMiwgInR3ZWx2ZSJ9LCB7MTMsICJ0aGlydGVlbiJ9LCB7MTQsICJmb3VydGVlbiJ9LAogICAgIHsxNSwgImZpZnRlZW4ifSwgezE2LCAic2l4dGVlbiJ9LCB7MTcsICJzZXZlbnRlZW4ifSwgezE4LCAiZWlnaHRlZW4ifSwgezE5LCAibmluZXRlZW4ifSwKICAgICB7MjAsICJ0d2VudHkifSwgezMwLCAidGhpcnR5In0sIHs0MCwgImZvcnR5In0sIHs1MCwgImZpZnR5In0sIHs2MCwgInNpeHR5In0sICAgIC8vIGlmIChuID4gOTk5KSB7CiAgICAvLyAgIHVbMF0gPSAxMDAwOwogICAgLy8gICBicmVhazsKICAgIC8vICAgIH0KCiAgICAgezcwLCAic2V2ZW50eSJ9LCB7ODAsICJlaWdodHkifSwgezkwLCAibmluZXR5In0sIHsxMDAsICJodW5kcmVkIn0sIHsxMDAwLCAib25ldGhvdXNhbmQifX07CiAgZm9yIChhdXRvIGQgOiB2ZWMpIHsKICAgIHRhYmxlLmluc2VydChkKTsKICB9CiAgc3RkOjpjb3V0IDw8IGV1bGVyXzE3KDEwMDAsIHRhYmxlKSA8PCBzdGQ6OmVuZGw7CiAgcmV0dXJuIDA7Cn0K