QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#542798#8934. Challenge NPCucup-team2000#RE 0ms0kbC++231.9kb2024-09-01 05:52:092024-09-01 05:52:11

Judging History

你现在查看的是最新测评结果

  • [2024-09-01 05:52:11]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-09-01 05:52:09]
  • 提交

answer

#include <bits/stdc++.h>

long long INF = 2E9;

int T;
char N[1100000];
int Nl;
long long M;
long long M10;
int Ml;
long long ans;
char AA[1100000];
int Al;

void search(int digit, long long cost, long long p10, bool all9) {
    long long number = 0;
    if (digit - Ml + 1 < 0) return;
    for (int i = digit - Ml + 1; i <= digit; ++i) {
        number = number * 10 + (N[i] - '0');
    }
    if (number == M && !all9) {
        ans = 1;
    }
    ++number;
    number %= M10;
    if (p10 < INF) {
        if (number > M) {
            ans = std::min((__int128) ans, (__int128) ((M10 - number) + M) * p10 + cost);
        } else {
            ans = std::min((__int128) ans, (__int128) (M - number) * p10 + cost);
        }
    }
    long long ncost = std::min(cost + (10 - (N[digit] - '0' + 1)) * p10, INF);
    search(digit - 1, ncost, std::min(p10 * 10, INF), all9 && N[digit] == '9');
}

int main() {
    scanf("%d", &T); while (T--) {
        for (int i = 0; i < 10; ++i) N[i] = '0';
        scanf(" %s%lld", N + 10, &M);
        Nl = strlen(N);
        long long tmp = M;
        Ml = 0;
        M10 = 1;
        while (tmp > 0) {
            tmp /= 10;
            M10 *= 10;
            ++Ml;
        }
        long long mod = 0;
        for (int i = 0; i < Nl; ++i) {
            mod = (mod * 10 + N[i] - '0') % M;
        }
        ans = M - mod;
        search(Nl - 1, 1, 1, 1);

        tmp = ans;
        std::fill(AA, AA + Nl, '0');
        Al = 0;
        while (tmp > 0) {
            AA[Nl - 1 - Al] = tmp % 10 + '0';
            tmp /= 10;
            ++Al;
        }
        int carry = 0;
        for (int i = Nl - 1; i >= 0; --i) {
            int sum = (N[i] - '0') + (AA[i] - '0') + carry;
            N[i] = sum % 10 + '0';
            carry = sum / 10;
        }
        for (int i = 0; i < Nl; ++i) {
            if (N[i] != '0') {
                puts(N + i);
                break;
            }
        }
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

input:

1

output:


result: