CSES - Shared codeLink to this code: https://cses.fi/paste/b245238f42728c9e65f592/
#include<bits/stdc++.h>
using namespace std;
using ll=long long int;
ll dp[20][10][2][2];
ll digitDP(vector<int>&num,int index,int prev,bool zeros,bool tight){
if(index==-1)return 1;
if(dp[index][prev][zeros][tight]!=-1)return dp[index][prev][zeros][tight];
int right=tight?num[index]:9;
ll ans=0;
for(int i=0;i<=right;i++){
if(!zeros and prev==i)continue;
ans+=digitDP(num,index-1,i,zeros and i==0,tight and i==num[index]);
}
return dp[index][prev][zeros][tight]=ans;
}
void digits(vector<int>&num,ll n){
num.clear();
while(n){
num.push_back(n%10);
n/=10;
}
}
int main() {
ll sola,solb,a,b;
memset(dp,-1,sizeof dp);
vector<int>num;
cin>>a>>b;
digits(num,a-1);
sola=digitDP(num,num.size()-1,0,1,1);
memset(dp,-1,sizeof dp);
digits(num,b);
solb=digitDP(num,num.size()-1,0,1,1);
printf("%lld",solb-sola);
}