#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |