QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#542798 | #8934. Challenge NPC | ucup-team2000# | RE | 0ms | 0kb | C++23 | 1.9kb | 2024-09-01 05:52:09 | 2024-09-01 05:52:11 |
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;
}
}
}
}
詳細信息
Test #1:
score: 0
Runtime Error
input:
1