记录编号 576994 评测结果 AAAAAAAAAA
题目名称 [SYOI 2018] WHZ 的数字 最终得分 100
用户昵称 Gravatarlihaoze 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-10-19 23:50:24 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>

using i64 = long long;

i64 base[21];
i64 f[21], g[21];

void init() {
    base[0] = 1;
    for (int i = 1; i <= 20; ++ i) 
        base[i] = base[i - 1] * 10;
    f[1] = 1;
    for (int i = 2; i <= 20; ++ i)
        f[i] = f[i - 1] * 10 + base[i - 1];
    for (int i = 2; i <= 20; ++ i) 
        g[i] = g[i - 1] + f[i - 1] * 9;
}

i64 dp(i64 n) {
    if (n == 0) return 1;
    std::vector<int> nums;
    while (n) nums.emplace_back(n % 10), n /= 10;
    i64 last = 0, ans = 0;
    ans = g[nums.size() - 1];
    for (int i = nums.size() - 1; i >= 0; -- i) {
        int x = nums[i];
        for (int j = i == nums.size() - 1; j < x; ++ j) {
            ans += last * base[i] + f[i];
            if (j == 0) ans += base[i];
        }
        if (x == 0) ++ last;
        if (i == 0) ans += last;
    }
    return ans;
}

int main() {
    freopen("whz_number.in", "r", stdin); 
    freopen("whz_number.out", "w", stdout);
    init();
    i64 n, k;
    while (std::cin >> n >> k) {
        if (dp(n) < k) {
            std::cout << 0 << '\n';
            continue;
        }
        i64 l = 0, r = n;
        while (l < r) {
            i64 mid = l + r >> 1;
            if (dp(n) - dp(mid) < k) r = mid;
            else l = mid + 1;
        }
        std::cout << r << '\n';
    }
    return 0;
}