Codeforces Round #786 (Div. 3) - 题解
作者:互联网
A. Number Transformation
翻译
- \(t\) 组数据,每组数据给定两个正整数 \(x, y\),要求构造出 \(a, b\) 使得 \(x \cdot b^a = y\),如果无解则输出 \(0\)。
- \(1 \leq t \leq 10^4, 1 \leq x, y \leq 100\)。
Solution
送分题。
首先判无解。考虑到 \(b^a\) 必定为正整数,所以如果 \(x \nmid y\),则无解。
如果有解,则说明 \(\frac{y}{x}\) 为正整数。那么我们构造 \(a = 1, b = \frac{y}{x}\) 就好啦。
Code
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) f = (ch == '-' ? -1 : f), ch = getchar();
while (isdigit(ch)) x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
return x*f;
}
int t, x, y;
signed main() {
t = read();
while (t--) {
x = read(), y = read();
if (y%x) printf("0 0\n");
else printf("1 %d\n", y/x);
}
}
B. Dictionary
翻译
- 有一门神奇的语言,每个单词只有两个互不相同的小写字母组成。
- 这门语言的词典里包含了所有的单词,单词按字典序排列。词典如下所示:
- 单词 \(1\):\(\texttt{ab}\)。
- 单词 \(2\):\(\texttt{ac}\)。
... - 单词 \(25\):\(\texttt{az}\)。
- 单词 \(26\):\(\texttt{ba}\)。
- 单词 \(27\):\(\texttt{bc}\)。
... - 单词 \(649\):\(\texttt{zx}\)。
- 单词 \(650\):\(\texttt{zy}\)。
- 现在给你这门语言的一个单词 \(s\),你需要求出它在词典里排第几个。
- \(t\) 组数据。 \(1 \leq t \leq 650\)。
Solution
我们知道,以 \(a\) 打头的单词有 \(25\) 个,以 \(b\) 打头的单词也有 \(25\) 个,...,以 \(z\) 打头的单词也有 \(25\) 个。
那么,第一个字母与 \(s\) 不同且排在 \(s\) 前面的单词就有 \((\)$s_0 - $' \(\texttt{a}\) ' \() \ \times \ 25\) 个。
接下来我们求出第一个字母与 \(s\) 相同且排在 \(s\) 前面的单词个数即可。
- 如果 \(s_0 < s_1\),那么显然有 $s_1 - $' \(\texttt{a}\) ' 个。
- 如果 \(s_0 > s_1\),那么显然有 $s_1 - $' \(\texttt{a}\) ' \(+ \ 1\) 个。
问题也就迎刃而解了。
Code
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) f = (ch == '-' ? -1 : f), ch = getchar();
while (isdigit(ch)) x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
return x*f;
}
string s;
int t;
signed main() {
t = read();
while (t--) {
cin >> s;
if (s[0] > s[1])
printf("%d\n", (s[0]-'a')*25+s[1]-'a'+1);
else printf("%d\n", (s[0]-'a')*25+s[1]-'a');
}
}
C. Infinite Replacement
翻译
- 给定仅由 '\(\texttt{a}\)' 组成的字符串 \(s\) 和由小写字母组成的字符串 \(t\)。
- 你可以执行任意次操作。每次操作你可以选择 \(s\) 中的一个字符 '\(\texttt{a}\)' 并将其换成字符串 \(t\)。
- 你需要求出你最终可以得到多少个不同的 \(s\)。如果答案是无穷大,输出 \(-1\)。
- \(q\) 组数据。\(1 \leq q \leq 10^4\) 且 \(s, t\) 的长度不超过 \(50\),保证 \(s\) 与 \(t\) 非空。
Solution
首先思考什么时候答案为无穷大。
考虑这样一种情况,\(t\) 中包含了字符 '\(\texttt{a}\)':
- 如果 \(t\) 的长度为 \(1\),那么字符串 \(s\) 无论如何都不会改变。此时答案为 \(1\)。
- 如果 \(t\) 的长度不为 \(1\),此时答案无穷大。
比如 $s = $ " \(\texttt{a}\) ",$t = $ " \(\texttt{ab}\) ",那么 \(s\) 就可以 " \(\texttt{a}\) " \(\rightarrow\) " \(\texttt{ab}\) " \(\rightarrow\) " \(\texttt{aab}\) " ...... 这样无穷变化下去。
其余情况下,根据子集相关知识,答案显然为 \(2^k\),其中 \(k\) 为 \(s\) 的长度。
注意要开 long long
。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) f = (ch == '-' ? -1 : f), ch = getchar();
while (isdigit(ch)) x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
return x*f;
}
const int L = 2e5 + 5;
string s, t;
bool f;
int q;
signed main() {
q = read();
while (q--) {
cin >> s >> t;
f = 0;
for (int i = 0; i < t.size(); i++)
if (t[i] == 'a') f = 1;
if (f) {
if (t.size() == 1)
puts("1");
else puts("-1");
} else
printf("%lld\n", (1LL<<s.size()));
}
}
D. A-B-C Sort
作者咕了,下次一定更。
E. Breaking the Wall
作者咕了,下次一定更。
标签:25,786,ch,int,题解,texttt,单词,leq,Div 来源: https://www.cnblogs.com/SparkleZH-Blog/p/16218009.html