悬赏两个关注
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int num[15],sum[15],t[15];
int qpow(int x,int y){
int k = 1;
for (;y;y>>=1,x = x * x)
if (y & 1)
k = k * x;
return k;
}
int calc(int x){
memset(sum,0,sizeof(sum));
int high = 0;
for (int i=1;i<=11;x/=10,i++) sum[i] = x % 10;
for (int i = 11;i>=1;i--)
if (sum[i] != 0){
high = i;
break;
}
int ans = 0;
for (int i=1;i<pow(3,11);i++){
int cnt = 0,f = 1,qans = 0;
memset(num,0,sizeof(num));
for (int j=1;j<=11;j++)
{
if (i % 3 == 1) num[j] = 6,cnt++;
if (i % 3 == 2) num[j] = 8,cnt++;
i /= 3;
}
if (cnt % 2 == 0) f = -1;
int q = high;
while (num[q] && q >= 1){
if (num[q] > sum[q]){
return ans;
} q--;
} if (!q) {
ans += f;
continue;
}
if (q == high) qans = qans + (sum[q] - 1) * qpow(10,q - cnt - 1);
else qans = qans + sum[q] * qpow(10,q - cnt - 1);
if (num[q-1] > sum[q-1])
continue;
int pans = 1,flag = 1;
for (int j = q - 2;j >= 1;j--){
if (num[j] > sum[j]){
if (flag == 0){
pans = pans / sum[j + 1] * (sum[j + 1] - 1);
if (num[j] != 0)pans = pans * 10;
flag = 1;
} else {
if (num[j] != 0) pans = pans * 9;
}
} else if (num[j] != 0) pans = pans * sum[j];
}
ans += f * (qans + pans);
}
return ans;
}
signed main()
{
cin >> a >> b;
cout << calc(b) - calc(a-1) << endl;
return 0;
}