Codeforces 1216E2

#include <bits/stdc++.h>
#define MOD 1000000007
#define N 3000
using namespace std;
typedef long long ll;
ll ten[15];
ll check1(ll x) {
        ll ans = 0;
        ll l, r;
        for (ll i = 1; i <= 9; i++) {
                l = ten[i], r = ten[i + 1] - 1;
                if (r <= x) {
                        ans += i * (2 * x - l - r) * (r - l + 1) / 2;
                } else {
                        ans += i * (2 * x - l) * (x - l + 1) / 2;
                        break;
                }
        }
        return ans;
}
ll check2(ll x) {
        ll ans = 0;
        ll l, r;
        for (ll i = 1; i <= 9; i++) {
                l = ten[i], r = ten[i + 1] - 1;
                if (r <= x) {
                        ans += i * (r - l + 1);
                } else {
                        ans += i * (x - l + 1);
                        break;
                }
        }
        return ans;
}
int main () {
        ten[1] = 1;
        for (int i = 2; i <= 10; i++) {
                ten[i] = ten[i - 1] * 10LL;
        }
        int Q;
        scanf("%d", &Q);
        while (Q--) {
                ll n;
                scanf("%lld", &n);
                ll l = 0, r = 1e9, mid;
                while (l < r - 1) {
                        mid = (l + r) >> 1;
                        if (check1(mid) < n) {
                                l = mid;
                        } else {
                                r = mid;
                        }
                }
                cout << "1: " << l << endl;
                n -= check1(l);
                l = 0;
                r = 1e9;
                while (l < r - 1) {
                        mid = (l + r) >> 1;
                        if (check2(mid) < n) {
                                l = mid;
                        } else {
                                r = mid;
                        }
                }
                cout << "2: " << l << endl;
                n -= check2(r - 1);
                int len = 0;
                ll xxx = r;
                while (xxx > 0) {
                        xxx /= 10;
                        len++;
                }
                len -= n;
                while (len--) {
                        xxx /= 10;
                }
                printf("%d\n", xxx % 10);
        }
}

猜你喜欢

转载自www.cnblogs.com/Aragaki/p/11580349.html