P5956 [POI 2017] Podzielno
题目描述
BBB 进制数,每个数字 i∈[0,B)i \in [0,B)i∈[0,B) 有 aia_iai 个。你要用这些数字组成一个最大的 BBB 进制数 XXX(不能有前导零,不需要用完所有数字),使得 XXX 是 B−1B-1B−1 的倍数。 qqq 次询问,每次询问 XXX 在 BBB进制下的第 kkk 位数字是什么(最低位是第 000 位)。
输入格式
第一行包含两个正整数 B,qB,qB,q。
第二行包含 BBB 个正整数 a0,a1,a2,...,aB−1a_0,a_1,a_2,...,a_{B-1}a0,a1,a2,...,aB−1。
接下来 qqq 行,每行一个整数 kkk,表示一个询问。
输出格式
输出 qqq 行,每行一个整数,依次回答每个询问,如果那一位不存在,请输出 -1。
输入输出样例 #1
输入 #1
3 3
1 1 1
0
1
2
输出 #1
0
2
-1
说明/提示
对于 100%100\%100% 的数据,2≤B≤1062\le B\le10^62≤B≤106,1≤q≤1051\le q\le 10^51≤q≤105,1≤ai≤1061\le a_i\le10^61≤ai≤106,0≤k≤10180\le k\le10^{18}0≤k≤1018。
C++实现
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, q;
std::cin >> n >> q;
std::vector<long long> a(n);
long long sum = 0;
for (int i = 0; i < n; ++i) {
std::cin >> a[i];
sum += i * a[i];
}
if (sum % (n - 1) != 0)
--a[sum % (n - 1)];
for (int i = 1; i < n; ++i)
a[i] += a[i - 1];
for (int i = 0; i < q; ++i) {
long long k;
std::cin >> k;
if (k >= a[n - 1]) {
std::cout << -1 << "\n";
} else {
std::cout << std::upper_bound(a.begin(), a.end(), k) - a.begin() << "\n";
}
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

被折叠的 条评论
为什么被折叠?



