Submission #370316

#TimeUsernameProblemLanguageResultExecution timeMemory
370316knightron0Palindrome-Free Numbers (BOI13_numbers)C++14
100 / 100
14 ms15596 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define fr first
#define sc second
#define clr(a, x) memset(a, x, sizeof(a))
#define dbg(x) cout<<"("<<#x<<"): "<<x<<endl;
#define printvector(arr) for (auto it = arr.begin(); it != arr.end(); ++it) cout<<*it<<" "; cout<<endl;
#define all(v) v.begin(), v.end()
#define lcm(a, b) (a * b)/__gcd(a, b)
#define int long long int
#define printvecpairs(vec) for(auto it: vec) cout<<it.fr<<' '<<it.sc<<endl;
#define endl '\n'
#define float long double

const int MOD = 1e9 + 7;
const int INF = 2e15;
const int MAXN = 1e5 + 5;

vector<int> v1, v2;
int dp1[20][22][22][2][2][25], dp2[20][22][22][2][2][25];

int solve1(int idx, int p1, int p2, bool same_upper, bool all_zeroes, int start){
	if(idx == (int)v1.size()) return 1;
	int hi = v1[idx];
	int ans= 0;
	if(dp1[idx][p1+1][p2+1][same_upper][all_zeroes][start] != -1) return dp1[idx][p1+1][p2+1][same_upper][all_zeroes][start];
	for(int i= 0;i<10;i++){
		bool valid = true;
		if(same_upper){
			if(i > hi) valid = false;
		}
		if((i == p1) && start < idx) {
			valid = false;
		}
		if((i == p2) && start < idx-1){
			valid = false;
		}
		if(!valid) continue;
		bool newb = (hi == i) && same_upper;
		bool same_zeroes = (i == 0) && all_zeroes;
		int newstart = start;
		if(all_zeroes && (i != 0)){
			newstart = idx;
		}
		ans += solve1(idx+1, i, p1, newb, same_zeroes, newstart);
	}
	return dp1[idx][p1+1][p2+1][same_upper][all_zeroes][start] = ans;
}

int solve2(int idx, int p1, int p2, bool same_upper, bool all_zeroes, int start){
	if(idx == (int)v2.size()) return 1;
	int hi = v2[idx];
	int ans= 0;
	if(dp2[idx][p1+1][p2+1][same_upper][all_zeroes][start] != -1){
		return dp2[idx][p1+1][p2+1][same_upper][all_zeroes][start];
	}
	for(int i= 0;i<10;i++){
		bool valid = true;
		if(same_upper){
			if(i > hi) valid = false;
		}
		if((i == p1) && start < idx) {
			valid = false;
		}
		if((i == p2) && start < idx-1){
			valid = false;
		}
		if(!valid) continue;
		bool newb = (hi == i) && same_upper;
		bool same_zeroes = (i == 0) && all_zeroes;
		int newstart = start;
		if(all_zeroes && (i != 0)){
			newstart = idx;
		}
		ans += solve2(idx+1, i, p1, newb, same_zeroes, newstart);
	}
	return dp2[idx][p1+1][p2+1][same_upper][all_zeroes][start] = ans;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    #ifdef LOCAL
    freopen("input.txt", "r", stdin);
    #endif
    int x, y;
    cin>>x>>y;
    int num = 0;
    if(x == 0){
    	num = 1;
    }
    x = max(x-1, 0LL);
    while(x>0){
    	v1.pb(x%10);
    	x/=10;
    }
    while(y>0){
    	v2.pb(y%10);
    	y/=10;
    }
    reverse(all(v1));
    reverse(all(v2));
    clr(dp1, -1);
    clr(dp2, -1);
    cout<<solve2(0, -1, -1, 1, 1, 20)-solve1(0, -1, -1, 1, 1, 20)+num<<endl;
    return 0;
}






#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...