题目链接:https://cn.vjudge.net/problem/CodeForces-1036C
题意:多少数1-9的数字不超过3个
题解:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[22][4];
int w[22], len;
ll dfs(int pos, int limit, int pre) {
if(pos < 0) return pre <= 3;
if(pre > 3) return 0;
if(!limit && dp[pos][pre] != -1) return dp[pos][pre];
int up = limit ? w[pos] : 9;
ll res = 0;
for(int i = 0; i <= up; i++) {
res += dfs(pos - 1, limit && i == up, pre + (i != 0));
}
if(!limit) dp[pos][pre] = res;
return res;
}
ll solve(ll x) {
len = 0;
while(x) {
w[len++] = x % 10;
x /= 10;
}
return dfs(len - 1, 1, 0);
}
int main() {
ll l, r;
memset(dp, -1, sizeof(dp));
int T;
scanf("%d", &T);
while(T--) {
scanf("%I64d %I64d", &l, &r);
printf("%I64d\n", solve(r) - solve(l - 1));
}
return 0;
}