感觉代码没什么毛病了啊,但是 78 分好多次了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 18 + 10;
ll l, r, dgt[N], f[N][2][13][13];
ll dp(int len, int op, int is0, ll lst1, ll lst2){
if(!len) return !is0;
if(!is0 && f[len][op][lst1][lst2] != -1) return f[len][op][lst1][lst2];
ll cnt = 0; int k = (op ? dgt[len] : 9);
for(int d=0;d<=k;d++){
if(d == lst1 || d == lst2) continue;
cnt += dp(len - 1, op & (d == k), is0 & (!d), d, lst1);
}
if(!is0) f[len][op][lst1][lst2] = cnt;
return cnt;
}
ll solve(ll x){
int len = 0;
do dgt[++len] = x % 10;
while(x /= 10);
memset(f, -1, sizeof(f));
return dp(len, 1, 1, 10, 10);
}
int main(){
scanf("%lld%lld", &l, &r);
printf("%lld\n", solve(r) - solve(l - 1));
return 0;
}