From 913a487c65c15d6dbce1dabffef640d6762294fc Mon Sep 17 00:00:00 2001 From: Segcolt <9hmbzr275@mozmail.com> Date: Mon, 10 Feb 2025 15:36:07 -0300 Subject: [PATCH] Add another problem --- CSES Problem Set/Counting Numbers.cpp | 126 ++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 CSES Problem Set/Counting Numbers.cpp diff --git a/CSES Problem Set/Counting Numbers.cpp b/CSES Problem Set/Counting Numbers.cpp new file mode 100644 index 0000000..ad39c39 --- /dev/null +++ b/CSES Problem Set/Counting Numbers.cpp @@ -0,0 +1,126 @@ +/* Problem URL: https://cses.fi/problemset/task/2220 */ + +#include + +using namespace std; + +#define V vector + +#define rmin(a, b) a = min(a, b) +#define rmax(a, b) a = max(a, b) + +#define rep(i, lim) for (size_t i = 0; i < (lim); i++) +#define nrep(i, s, lim) for (size_t i = s; i < (lim); i++) + +#define repv(i, v) for (auto &i : (v)) +#define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } +#define sortv(v) sort(v.begin(), v.end()) +#define all(v) (v).begin(), (v).end() + +using vi = vector; +using vvi = vector; +using vvvi = vector; +using vvvvi = vector; + +using ll = long long; + +using vl = vector; +using vvl = vector; +using vvvl = vector; +using vvvvl = vector; + +template +auto operator<<(ostream &os, const vector &vec)->ostream& { + os << vec[0]; + for (size_t i = 1; i < vec.size(); i++) { + os << ' ' << vec[i]; + } + os << '\n'; + return os; +} + +template +auto operator>>(istream &is, vector &vec)->istream& { + for (auto &i : vec) { + is >> i; + } + return is; +} + +template +auto operator<<(ostream &os, const vector> &vec)->ostream& { + for (auto &i : vec) { + os << i[0]; + for (size_t j = 1; j < i.size(); j++) { + os << ' ' << i[j]; + } + os << '\n'; + } + return os; +} + +template +auto operator>>(istream &is, vector> &vec)->istream& { + for (auto &i : vec) { + for (auto &j : i) { + is >> j; + } + } + return is; +} + +vvvvl memo; + +void dec(int i, string &a) +{ + if (a[i] == '0') { + a[i] = '9'; + dec(i - 1, a); + return; + } + + a[i] -= 1; +} + +ll dp(int i, int prev, int started, int under, string &a) +{ + if (i >= memo.size()) { + return 1; + } + + ll &ans = memo[i][prev][started][under]; + if (ans != -1) { + return ans; + } + + ans = 0; + + for (char j = under ? 9 : a[i] - '0'; j >= 0; j--) { + if (j != prev || !started) { + ans += dp(i + 1, j, j != 0 || started, j < a[i] - '0' || under, a); + } + } + + return ans; +} + +int main() +{ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + ll ai, bi; + cin >> ai >> bi; + string a = to_string(ai); + string b = to_string(bi); + + memo.assign(b.size(), vvvl(10, vvl(2, vl(2, -1)))); + ll ans = dp(0, 0, 0, 0, b); + if (a != "0") { + dec(a.size() - 1, a); + memo.assign(a.size(), vvvl(10, vvl(2, vl(2, -1)))); + ans -= dp(0, 0, 0, 0, a); + } + + cout << ans << '\n'; +}