ABC171
A
判断这个字符是大写还是小写,大写输出\(A\)小写输出\(a\)
char s;
std::cin >> s;
std::cout << (std::isupper(s) ? "A" : "a");
B
有\(N\)个物品,选出\(K\)个物品,使选出的物品价值之和最小。排个序将前\(k\)个加起来就行了
int n, m;
std::cin >> n >> m;
std::vector<int> a(n);
for (auto& v : a) std::cin >> v;
std::sort(a.begin(), a.end());
std::cout << std::accumulate(a.begin(), a.begin() + m, 0) << "\n";
C
将\(N\)转化为字母表达,每次输出\(N % 26\)对应的字符就可以了,注意要倒着输出
i64 N;
std::cin >> N;
std::string s = "";
while(N) {
N --;
s += char(N % 26 + 'a');
N /= 26;
}
std::reverse(s.begin(), s.end());
std::cout << s;
D
考虑先将所有数的和加起来,并且将每个数的个数存下来,这样在后面\(q\)次操作的时候,只需要在原来的和的基础上加上\(cnt[b]\)个\(c\)和\(b\)的差值就可以了。
int n;
std::cin >> n;
i64 ans = 0;
for (int i = 1; i <= n; i++ ) {
std::cin >> a[i];
ans += a[i];
cnt[a[i]]++;
}
int q;
std::cin >> q;
for (int i = 0; i < q; i ++ ) {
int b, c;
std::cin >> b >> c;
ans += (c - b) * 1ll * cnt[b];
cnt[c] += cnt[b];
cnt[b] = 0;
std::cout << ans << "\n";
}
E
不难发现将所给的\(n\)个数全部异或起来,得到的就是所要求的原序列\(n\)个数的异或和记为\(ans\),那么我们只需要每次输出\(ans\oplus a\left[i\right]\)就可以了
int n;
std::cin >> n;
std::vector<int> a(n);
i64 ans = 0;
for (int i = 0; i < n; i++ ) {
std::cin >> a[i];
ans ^= a[i];
}
for (int i = 0; i < n; i++ ) {
std::cout << (ans ^ a[i]) << " \n"[i == n - 1];
}
F
要在原有的字符串的基础上插入\(m\)个字符,记原来的字符串的长度为\(n\),那么此时的长度就是\(n + m\),在放入字符的时候,此时有\(i\left(0\leq i\leq n\right)\)个空位,那么就是有\(26 ^ i\)个方案;由于不确定是在哪一个空位放数字,所以有\(m - 1\)种选择,\(\dbinom{n + m - i - 1}{m - 1}\);此时就剩下\(n - i\)个空位了,也就还有\(25 ^ {n - i}\)中方案。最终的答案就是\(ans = \sum\limits_{i = 0} ^ {n} 26 ^ i × \dbinom{n + m - i - 1}{m - 1} × 25 ^ {n - i}\)
CNM::init();
int n;
std::string s;
std::cin >> n >> s;
Z ans = 0;
int m = s.size();
for (int i = 0; i <= n; i++ ) {
ans += power(Z(26), i) * CNM::binom(n + m - i - 1, m - 1) * power(Z(25), n - i);
}
std::cout << ans << "\n";

浙公网安备 33010602011771号