不妨区间化。先计算出 ≤R 的最大蛇数 r。记录这个数为 dN,dN−1,⋯,d2,d1(这里是按从前往后数位顺序给出的),那么 ≤r 的蛇数个数为 i=1∑N(di)i。
#include <bits/stdc++.h>
#define i64 long long
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define fdn(i,r,l) for(int i=(r);i>=(l);i--)
#define pii pair<int,int>
using namespace std;
typedef long long ll;
typedef double db;
typedef __int128 i128;
std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
std::mt19937_64 rnd64(std::chrono::steady_clock::now().time_since_epoch().count());
ll L,R;
ll slow_power(ll a,ll b)
{
ll ans=1;
rep(i,1,b) ans*=a;
return ans;
}
ll solve(ll x)
{
ll X=x;
int len=0;
vector<int> dig(25,0);
while(X) dig[++len]=X%10,X/=10;
fdn(i,len-1,1)
if(dig[i]>=dig[len])
{
fdn(j,i,1) dig[j]=dig[len]-1;
break;
}
ll ans=0;
fdn(i,len,1)
ans+=slow_power(dig[i],i);
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin>>L>>R;
cout<<solve(R)-solve(L-1);
}