Submission #1211546

#TimeUsernameProblemLanguageResultExecution timeMemory
1211546i_love_springPalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
3 ms1252 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; ll dp[20][2][2][11][11][11]; // pos, tight, leading_zero, last3 digits string s; bool has_palindrome(int a, int b, int c) { // a, b, c are last 3 digits // check for 2 or 3 length palindromes if (a != -1 && b != -1 && a == b) return true; // "aa" if (b != -1 && c != -1 && b == c) return true; // "bb" if (a != -1 && c != -1 && a == c) return true; // "aba" return false; } ll dfs(int pos, bool tight, bool leading_zero, int a, int b, int c) { if (pos == s.size()) return 1; ll& res = dp[pos][tight][leading_zero][a + 1][b + 1][c + 1]; if (res != -1) return res; res = 0; int limit = tight ? s[pos] - '0' : 9; for (int d = 0; d <= limit; ++d) { bool new_tight = tight && (d == limit); bool new_leading_zero = leading_zero && (d == 0); int na = b, nb = c, nc = d; if (new_leading_zero) { na = nb = nc = -1; } if (!new_leading_zero && has_palindrome(na, nb, nc)) continue; res += dfs(pos + 1, new_tight, new_leading_zero, na, nb, nc); } return res; } ll count_palindrome_free_up_to(ll n) { if (n < 0) return 0; s = to_string(n); memset(dp, -1, sizeof(dp)); return dfs(0, true, true, -1, -1, -1); } ll count_palindrome_free_range(ll a, ll b) { return count_palindrome_free_up_to(b) - count_palindrome_free_up_to(a - 1); } int main() { ll a, b; cin >> a >> b; cout << count_palindrome_free_range(a, b) << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...