/* -*- coding: utf-8 -*- * * 3549.cc: No.3549 SigMax Digits (Judge ver.) - yukicoder */ #include #include using namespace std; /* constant */ const int DN = 19; const long long MAX_R = 100000000000000000LL; /* typedef */ using ll = long long; /* global variables */ ll es[11][DN], dp[10][DN]; /* subroutines */ int f(ll n) { int x = 0; while (n > 0) x = max(x, (int)(n % 10)), n /= 10; return x; } ll sigf(ll n) { // sigma_{0<=i 0) ds[l++] = n % 10, n /= 10; ll sum = 0; int maxd = 0; for (int i = l - 1; i >= 0; i--) { for (int j = 0; j < ds[i]; j++) { int maxj = max(maxd, j); for (int k = 0; k <= 9; k++) { int maxk = max(maxj, k); sum += dp[k][i] * maxk; } } maxd = max(maxd, ds[i]); } return sum; } /* main */ int main() { // es[i][j] = i^j (0<=i<=9) for (int i = 0; i <= 10; i++) { es[i][0] = 1; for (int j = 1; j < DN; j++) es[i][j] = es[i][j - 1] * i; } // dp[i][j] = # of n where 0<=n<10^j && max dig of n = i for (int i = 0; i <= 9; i++) { for (int j = 0; j < DN; j++) dp[i][j] = es[i + 1][j] - es[i][j]; } dp[0][0] = 1; //for (int i = 0; i <= 9; i++) printf(" %lld", dp[i][0]); putchar('\n'); int tn; scanf("%d", &tn); while (tn--) { ll l, r; scanf("%lld%lld", &l, &r); printf("%lld\n", sigf(r + 1) - sigf(l)); } return 0; }