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";
posted @ 2022-08-18 21:21  浅渊  阅读(37)  评论(0)    收藏  举报