A-Haitang and Game
题意
给出一个数组,两人轮流,每次选择数组中的两个数,若这两个数的不在当前的数组里,就将这两个数的加入到数组中,不能再加数的一方输。
数据范围
思路
整个数组的最终含有哪些数是确定的,枚举的每个数,记为,查看数组中大于的整数倍的数,若这些倍数的恰好等于,则会出现在最终的数组中。
代码
void solve() {
int n;cin >> n;
vector<int>a(n);
vector<bool>vis(100005, false);
int mx = -1;
for (int i = 0;i < n;i++) {
cin >> a[i];
vis[a[i]] = true;
if (mx != -1)mx = max(mx, a[i]);
else mx = a[i];
}
if (n == 1) {
cout << "Haitang\n";return;
}
int ans = 0;
for (int i = 1;i <= mx;i++) {
if (vis[i])continue;
vector<int>g;
for (int j = 2 * i;j <= mx;j += i) {
if (vis[j])g.push_back(j);
}
if (g.size() >= 2) {
int k = gcd(g[0], g[1]);
for (int j = 2;j < g.size();j++) {
k = gcd(k, g[j]);
}
if (k == i) {
ans++;
vis[i] = true;
}
}
}
if (ans % 2) {
cout << "dXqwq\n";
}
else {
cout << "Haitang\n";
}
}
K-Haitang and Ava
题意
符合以下条件的字符串的合法的:
- 空串是合法的。
- 在合法串的前面或后面加形成的字符串是合法的。
- 在合法串的前面或后面加形成的字符串是合法的。
给你一个字符串,判断它是否合法。
数据范围
思路
逐步删去前缀或后缀,若最后能删成空串,则为合法串。
代码
void solve() {
string s;cin >> s;
int l = 0, r = s.size() - 1;
while (l <= r) {
string t;
if (r - l + 1 >= 5) {
t = s.substr(l, 5);
if (t == "avava") {
l += 5;continue;
}
t = s.substr(r - 4, 5);
if (t == "avava") {
r -= 5;continue;
}
}
if (r - l + 1 >= 3) {
t = s.substr(l, 3);
if (t == "ava") {
l += 3;continue;
}
t = s.substr(r - 2, 3);
if (t == "ava") {
r -= 3;continue;
}
}
break;
}
if (l > r) {
cout << "Yes\n";
}
else {
cout << "No\n";
}
}