Submission #605644

#TimeUsernameProblemLanguageResultExecution timeMemory
605644MODDIPalindrome-Free Numbers (BOI13_numbers)C++14
100 / 100
1 ms772 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pll pair<ll,ll> #define vi vector<int> #define vl vector<ll> #define mp make_pair #define pb push_back using namespace std; ll set_on(int n, int k){ return (n |= 1 << k); } ll set_off(int n, int k){ return (n &= ~(1UL << k)); } bool check_bit(int n, int k){ int bit = (n >> k) & 1U; if(bit == 1) return true; return false; } ll dp[25][25][25][2][2]; vi get_digits(ll n) { vi v; do { v.push_back(n % 10); n /= 10; } while (n > 0); reverse(v.begin(), v.end()); return v; } ll f(int idx, int last, int blast, bool big, bool nonzero, vi& digits){ if(idx == (int)digits.size()){ return dp[idx][last][blast][big][nonzero] = 1; } if(dp[idx][last][blast][big][nonzero] != -1) return dp[idx][last][blast][big][nonzero]; ll ans = 0; int sega = digits[idx]; if(big) sega = 9; for(int d = 0; d <= sega; d++){ if(d == last || d == blast) continue; bool nxtSmall = true; if(!big && d == sega){ nxtSmall = false; } bool nZero = nonzero | (d > 0); int lst = last, curr = d; if(d == 0 && !nonzero){ lst = 10; curr = 10; } ans += f(idx + 1, curr, lst, nxtSmall, nZero, digits); } return dp[idx][last][blast][big][nonzero] = ans; } ll solve(ll n) { if (n <= 10) { return (n == -1 ? 0 : n + 1); } memset(dp, -1, sizeof dp); auto digits = get_digits(n); return f(0, 10, 10, false, false, digits); } int main(){ ll l, r; cin>>l>>r; cout<<solve(r) - solve(l-1)<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...