#include #include #include #include #include #include template inline bool chmin(T &lhs, const U &rhs) { if (lhs > rhs) { lhs = rhs; return true; } return false; } template inline bool chmax(T &lhs, const U &rhs) { if (lhs < rhs) { lhs = rhs; return true; } return false; } struct range { using itr = int64_t; struct iterator { itr i; constexpr iterator(itr i_) noexcept : i(i_) { } constexpr void operator ++ () noexcept { ++i; } constexpr itr operator * () const noexcept { return i; } constexpr bool operator != (iterator x) const noexcept { return i != x.i; } }; const iterator l, r; constexpr range(itr l_, itr r_) noexcept : l(l_), r(std::max(l_, r_)) { } constexpr iterator begin() const noexcept { return l; } constexpr iterator end() const noexcept { return r; } }; struct revrange { using itr = int64_t; struct iterator { itr i; constexpr iterator(itr i_) noexcept : i(i_) { } constexpr void operator ++ () noexcept { --i; } constexpr itr operator * () const noexcept { return i; } constexpr bool operator != (iterator x) const noexcept { return i != x.i; } }; const iterator l, r; constexpr revrange(itr l_, itr r_) noexcept : l(l_ - 1), r(std::max(l_, r_) - 1) { } constexpr iterator begin() const noexcept { return r; } constexpr iterator end() const noexcept { return l; } }; using i32 = int32_t; using i64 = int64_t; using u32 = uint32_t; using u64 = uint64_t; constexpr i32 inf32 = (i32(1) << 30) - 1; constexpr i64 inf64 = (i64(1) << 62) - 1; i64 dp[30][3000][2][2]; int main() { i64 N; std::cin >> N; ++N; std::vector digit; { i64 n = N; while (n > 0) { i64 r = n % 5; digit.push_back(r); n /= 5; if (r >= 3) { digit.back() -= 5; ++n; } } std::reverse(digit.begin(), digit.end()); } size_t size = digit.size(); dp[0][1500][0][0] = 1; for (auto i: range(0, size)) { for (auto j: range(0, 3000)) { for (auto l: { 0, 1 }) { for (auto c: { -2, -1, 0, 1, 2 }) { if (j + c < 0 || j + c >= 3000 || (l == 0 && c < 0)) { continue; } auto nl = l; if (c > 0) { nl = 1; } for (auto k: { 0, 1 }) { if (k == 0 && c > digit[i]) { continue; } auto nk = k; if (c < digit[i]) { nk = 1; } dp[i + 1][j + c][nk][nl] += dp[i][j][k][l]; } } } } } std::cout << dp[size][1500][1][1] << '\n'; return 0; }