Submission #813472

#TimeUsernameProblemLanguageResultExecution timeMemory
813472BlagojPalindrome-Free Numbers (BOI13_numbers)C++17
100 / 100
1 ms376 KiB
#include <bits/stdc++.h> #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif using namespace std; #define endl '\n' #define ll long long #define all(x) x.begin(), x.end() string goal; ll dp[20][11][11][2][2]; ll calc(int pos, int beforeLast, int last, bool bigger, bool leading) { if (dp[pos][beforeLast][last][bigger][leading]) return dp[pos][beforeLast][last][bigger][leading]; if (pos == goal.size()) return dp[pos][beforeLast][last][bigger][leading] = 1; ll ans = 0; if (pos == 0) { for (int i = 0; i <= min(9, goal[0] - '0'); i++) ans += calc(pos + 1, last, i == 0 ? 10 : i, i < goal[0] - '0', i == 0); return dp[pos][beforeLast][last][bigger][leading] = ans; } else if (leading) { for (int i = 0; i < 10; i++) ans += calc(pos + 1, last, i == 0 ? 10 : i, 1, (i == 0)); return dp[pos][beforeLast][last][bigger][leading] = ans; } else { for (int i = 0; i < 10; i++) { if (last != i && beforeLast != i) { if (bigger) ans += calc(pos + 1, last, i, 1, 0); else if (i <= goal[pos] - '0') ans += calc(pos + 1, last, i, i < goal[pos] - '0', 0); } } } return dp[pos][beforeLast][last][bigger][leading] = ans; } ll solve(ll x) { memset(dp, 0, sizeof(dp)); goal = to_string(x); return calc(0, 10, 10, 0, 0); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); ll l, r; cin >> l >> r; cout << solve(r) - (l != 0 ? solve(l - 1) : 0); }

Compilation message (stderr)

numbers.cpp: In function 'long long int calc(int, int, int, bool, bool)':
numbers.cpp:21:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |  if (pos == goal.size()) return dp[pos][beforeLast][last][bigger][leading] = 1;
      |      ~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...