#include #include #include using namespace std; typedef long long int64; const int kMaxQ = 5e4+10; const int kSq = 100; struct Query { int l, r, i; }q[kMaxQ]; int calc(int x) { int s = 0; while (x) { int dig = x % 10; if (dig == 4) s += 1; if (dig == 7) s -= 1; x /= 10; } return s; } int mark[500010], pre[kMaxQ], finAns[kMaxQ]; int64 ans; int ind(int x) { return x + 250000; } void precalc() { int maxn = 5e4; for (int i = 1; i <= maxn; ++i) { pre[i] = pre[i-1] + calc(i); } } void add(int x) { ans += mark[ind(pre[x])]; mark[ind(pre[x])]++; // cout << "Add " << pre[x] << " " << ans << "\n"; } void rem(int x) { mark[ind(pre[x])]--; ans -= mark[ind(pre[x])]; // cout << "Rem " << pre[x] << " " << ans << "\n"; } int main() { precalc(); int Q; cin.sync_with_stdio(false); cin >> Q; for (int i = 1; i <= Q; ++i) { cin >> q[i].l >> q[i].r; q[i].i = i; } auto cmp = [](const Query& a, const Query& b) { if (a.l / kSq == b.l / kSq) { return a.r < b.r; } return a.l / kSq < b.l / kSq; }; sort(q+1, q+Q+1, cmp); int l = 1, r = 0; mark[ind(0)]++; for (int i = 1; i <= Q; ++i) { while (r < q[i].r) { ++r; add(r); } while (q[i].l < l) { --l; add(l-1); } // cout << l << " " << r << "\n"; while (r > q[i].r) { rem(r); --r; } while (q[i].l > l) { rem(l-1); ++l; } finAns[q[i].i] = ans; } for (int i = 1; i <= Q; ++i) { cout << finAns[i] << "\n"; } }