#include #include #include using namespace std; const int MAX_N = 50100; int countDigit(int nr, int d) { int ans = 0; while(nr) { ans += (nr % 10 == d); nr /= 10; } return ans; } int fors[MAX_N]; int sevens[MAX_N]; int counter[MAX_N]; long long ans; const int SQRT_VAL = 224; struct query { int l, r, poz; query(int _l = 0, int _r = 0, int _poz = 0) { l = _l; r = _r; poz = _poz; } inline bool operator < (const query &other) const { if(l / SQRT_VAL == other.r / SQRT_VAL) { return r > other.r; } return l / SQRT_VAL < other.l / SQRT_VAL; } }; vector queries; long long sol[MAX_N]; int main() { cin.sync_with_stdio(false); for(int i = 1; i < MAX_N; i++) { fors[i] = fors[i - 1] + countDigit(i, 4); sevens[i] = sevens[i - 1] + countDigit(i, 7); } int n; cin >> n; for(int i = 1; i <= n; i++) { int a, b; cin >> a >> b; queries.push_back(query(a, b, i)); } sort(queries.begin(), queries.end()); int lastX = queries[0].l; int lastY = queries[0].r; counter[0] = 1; for(int i = lastX; i <= lastY; i++) { ans += counter[fors[i] - sevens[i]]; counter[fors[i] - sevens[i]]++; } sol[queries[0].poz] = ans; for(auto it = queries.begin() + 1; it < queries.end(); it++) { if(it->l >= lastX) { for(int i = lastX; i < it->l; i++) { counter[fors[i] - sevens[i]]--; ans -= counter[fors[i] - sevens[i]]; } } else { for(int i = it->l; i < lastX; i++) { ans += counter[fors[i] - sevens[i]]; counter[fors[i] - sevens[i]]++; } } if(lastY <= it->r) { for(int i = lastY + 1; i <= it->r; i++) { ans += counter[fors[i] - sevens[i]]; counter[fors[i] - sevens[i]]++; } } else { for(int i = it->r + 1; i <= lastY; i++) { counter[fors[i] - sevens[i]]--; ans -= counter[fors[i] - sevens[i]]; } } lastX = it->l; lastY = it->r; sol[it->poz] = ans; } for(int i = 1; i <= n; i++) { cout << sol[i] << '\n'; } return 0; }