Submission #1120665

#TimeUsernameProblemLanguageResultExecution timeMemory
1120665MamedovPalindrome-Free Numbers (BOI13_numbers)C++17
100 / 100
1 ms508 KiB
#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
//#include<ext/pb_ds/assoc_container.hpp>
//#include<ext/pb_ds/tree_policy.hpp>
#define pii pair<int, int>
#define piii pair<pii, int>
#define vi vector<int>
#define vll vector<ll>
#define vvi vector<vi>
#define vpii vector<pii>
#define vvpii vector<vpii>
#define f first
#define s second
#define oo 1000000001
#define eb emplace_back
#define pb push_back
#define mpr make_pair
#define size(v) (int)v.size()
#define ln '\n'
#define ull unsigned long long
#define ll long long
#define all(v) v.begin(), v.end()
#define iospeed ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
//#define pbase 361549
//#define imod 1073737591
//#define uimod 2147479307u
//#define llmod 292187309552789533ll


using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

//using namespace __gnu_pbds;
//template <typename T>
//using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

template <typename T>
void show(vector<T> &v) {
  for (T i : v) {
    cout << i << ' ';
  }
  cout << ln;
}

const int MAX = 20;
const int D = 11;
ll dp[MAX][D][D][2];

ll solve(string &s, int pos, int d1, int d2, int strict) {  /// digits in [1, 10], use 0 for no digit
  if (size(s) == pos) return 1;
  if (dp[pos][d1][d2][strict] != -1) return dp[pos][d1][d2][strict];
  ll res = 0;
  if (!d2) res += solve(s, pos + 1, d1, d2, 0);
  int st = 1 + (!d2 ? 1 : 0);
  if (!strict) {
    for (int d3 = st; d3 < D; ++d3) {
      if (d3 != d1 && d3 != d2) res += solve(s, pos + 1, d2, d3, 0);
    }
  } else {
    int d = s[pos] - '0' + 1;
    for (int d3 = st; d3 <= d; ++d3) {
      if (d3 != d1 && d3 != d2) {
        if (d3 == d) res += solve(s, pos + 1, d2, d3, 1);
        else res += solve(s, pos + 1, d2, d3, 0);
      }
    }
  }
  return dp[pos][d1][d2][strict] = res;
}
ll palFree(ll n) {
  if (n < 0) return 0;
  string s = to_string(n);
  for (int i = 0; i < MAX; ++i) {
    for (int d1 = 0; d1 < D; ++d1) {
      for (int d2 = 0; d2 < D; ++d2) {
        for (int k = 0; k < 2; ++k) {
          dp[i][d1][d2][k] = -1;
        }
      }
    }
  }
  return solve(s, 0, 0, 0, 1);
}
void solve() {
  ll a, b;
  cin >> a >> b;
  cout << palFree(b) - palFree(a - 1) << ln;
}
int main() {
  iospeed;
  solve();
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...