Submission #1173418

#TimeUsernameProblemLanguageResultExecution timeMemory
1173418NurislamPalindrome-Free Numbers (BOI13_numbers)C++20
85 / 100
18 ms584 KiB
#include <bits/stdc++.h>

using namespace std;


#define int __int128
//#define pb push_back

int inf = 1e18; 

const int mod = 1e9 + 7;
const int N = 1e5 + 5;

int read() {
	string s;
	cin >> s;
	int va = 0;
	for(auto x : s) {
		va = va *10 + (x-'0');
	}
	return va;
};

void prin(int va) {
	if(va == 0) return cout << 0 << '\n', void();
	string s;
	while(va > 0) {
		s += va%10 + '0';
		va/= 10;
	}
	reverse(s.begin(), s.end());
	cout << s << '\n';
}


vector<int> pw(22, 1);
int dig(int &va, int id){
	return (va / pw[id]) %10;
};

int sz(int x){
	if(x <= 0) return 0;
	int len = 18;
	while(x / pw[len] == 0)len--;
	return len;
};

map<array<int,4>, int> mp;
int get (int la, int lla, int id, bool ispr, int lim) {
	if(lim < 0)return 0;
	if(id < 0)return 1;
	if(mp[{la, lla, id, ispr}]) return  mp[{la, lla, id, ispr}];
	
	int res = 0;
	int x = dig(lim, id);
	for(int i = 0; i < 10; i ++ ){
		if(i == la || i == lla) continue;
		if(ispr && i > x)continue;
		if(ispr && i == x) 
			res += get(i, la, id-1, 1, lim);
		else res += get(i, la, id-1, 0, lim);
	}
	//cout << la << ' ' << lla << ' ' << id << ' ' << ispr << ' ' << res << '\n';
	//cout << lim << ' ' << id << ' ' << x << '\n';
	return mp[{la, lla, id, ispr}] = res;
};
void solve(){
	
	for(int i = 1; i < 22; i ++ ) pw[i] = pw[i-1] * 10;
	
		
	auto ok = [&] (int x) -> bool {
		int len = sz(x);
		
		for(int i = 0; i + 1 <= len; i ++ ) {
			if(dig(x, i) == dig(x, i+1))return 0;
			if(i + 2 <= len && dig(x, i) == dig(x, i + 2))return 0;
		}
		return 1;
	};
	
	int l, r;
	l = read();
	r = read();
	
	if(r - l < 200000) {
		
		int ans = 0;
		for(int i = l; i <= r; i ++ ) {
			ans += ok(i);
		};
		
		prin(ans);
		return;
	};
	
	r = get(-1, -2, sz(r), 1, r);
	mp.clear();
	
	prin(r - get(-4, -5, sz(l), 1, l) + ok(l));
};



signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int tt = 1;
	//cin >> tt;
	
	while(tt -- ){
		solve();
	};
	
};

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