제출 #1289162

#제출 시각아이디문제언어결과실행 시간메모리
1289162WH8Palindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms580 KiB
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
#define sz(x) static_cast<int>((x).size())
#define i5 tuple<int,int,int,int,int>
int mem[20][11][11][2];
string num;

int dp(int x, int p2, int p1, bool ib){
	if(mem[x][p2][p1][ib] != -1)return mem[x][p2][p1][ib];
	if(x >= num.size())return 1;
	int cdig=num[x]-'0', sm=0;
	if(ib){
		if(p1 == 10){
			assert(p2==10);
			sm += dp(x+1, 10, 10, 0);
		}
		else if (p1 != 0 and p2 != 0){
			sm += dp(x+1, p1, 0, (cdig==0));
		}
		for(int i=1;i<cdig;i++){
			if(i != p2 and i != p1){
				sm+=dp(x+1, p1, i, 0);
			}
		}
		if (p1 != cdig and p2 != cdig and cdig != 0){
			sm+=dp(x+1, p1, cdig, 1);
		}
	}
	else{
		if (p1 == 10){
			assert(p2==10);
			sm += dp(x+1, 10, 10, 0);
		}
		else{
			if(p1 != 0 and p2 != 0) sm+=dp(x+1, p1, 0, 0);
		}
		for(int i=1;i<10;i++){
			if(p1 != i and p2 != i) sm+=dp(x+1, p1, i, 0);
		}
	}
	return mem[x][p2][p1][ib]=sm;
}
signed main(){
	int bel, abv, temp;
	cin>>temp;
	memset(mem, -1, sizeof mem);
	if(temp==0){
		bel=0;
	}
	else {
		num=to_string(temp-1);
		bel=dp(0, 10, 10, 1);
	}
	memset(mem, -1, sizeof mem);
	cin>>num;
	abv=dp(0, 10, 10, 1);
	//printf("bel %lld, abv %lld\n", bel, abv);
	cout<<abv-bel;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...