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...