#include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair ii; const int Maxn = 50005; const int Maxm = 500015; const int nil = 250005; const int Maxp = 230; int has[Maxn]; int my[Maxm]; ll res; int L[Maxn], R[Maxn]; vector quer[Maxp]; ll ans[Maxn]; int Get(int x) { int res = 0; while (x) { if (x % 10 == 4) res--; if (x % 10 == 7) res++; x /= 10; } return res; } void Add(int val) { res += my[val + nil]++; } void Rem(int val) { res -= --my[val + nil]; } int main() { cin.sync_with_stdio(false); for (int i = 1; i < Maxn; i++) has[i] = Get(i) + has[i - 1]; int q; cin >> q; for (int i = 0; i < q; i++) { int l, r; cin >> l >> r; l--; if (r - l + 1 <= Maxp) { for (int j = l; j <= r; j++) Add(has[j]); ans[i] = res; for (int j = l; j <= r; j++) Rem(has[j]); } else { quer[l / Maxp + 1].push_back(ii(r, i)); L[i] = l; R[i] = r; } } for (int i = 0; i < Maxp; i++) if (!quer[i].empty()) { int curL = i * Maxp, curR = i * Maxp; sort(quer[i].begin(), quer[i].end()); for (int j = 0; j < quer[i].size(); j++) { int ind = quer[i][j].second; while (curR <= R[ind]) { Add(has[curR]); curR++; } while (curL < L[ind]) { Rem(has[curL]); curL++; } while (L[ind] < curL) { curL--; Add(has[curL]); } ans[ind] = res; } while (curL < i * Maxp) { Rem(has[curL]); curL++; } while (curR > i * Maxp) { curR--; Rem(has[curR]); } } for (int i = 0; i < q; i++) cout << ans[i] << endl; return 0; }