【比赛链接】
【题解链接】
**【A】**Doggo Recoloring
【思路要点】
- 首先当 N = 1 N=1 N=1,答案为 Y e s Yes Yes。
- 否则,当且仅当存在一个字符出现了至少两次,答案为 Y e s Yes Yes。
- 时间复杂度 O ( N ) O(N) O(N)。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 100005; template <typename T> void chkmax(T &x, T y) { x = max(x, y); } template <typename T> void chkmin(T &x, T y) { x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); } template <typename T> void writeln(T x) { write(x); puts(""); } int n, cnt[256]; char s[MAXN]; int main() { int n; read(n); bool ans = n == 1; scanf("\n%s", s + 1); for (int i = 1; i <= n; i++) { if (cnt[s[i]]) ans = true; cnt[s[i]]++; } if (ans) printf("Yes\n"); else printf("No\n"); return 0; }
**【B】**Weakened Common Divisor
【思路要点】
- 令 c i = a i ∗ b i c_i=a_i*b_i ci=ai∗bi,令所有 c i c_i ci的 g c d gcd gcd为 g g g,当且仅当 g = 1 g=1 g=1,答案为 − 1 -1 −1。
- 否则, g g g的每一个质因数一定都可以作为答案,我们只需要找到 g g g的任意一个可以作为答案的因数即可,注意这里 g g g可能是两个大质数的乘积,因此不能直接质因数分解。
- 实际上我们只需要通过判断 g c d ( g , a i ) gcd(g,a_i) gcd(g,ai)是否为 1 1 1来判断 a i a_i ai是不是可取的,若 g c d ( g , a i ) ≠ 1 gcd(g,a_i)\ne1 gcd(g,ai)̸=1,则令 g = g c d ( g , a i ) g=gcd(g,a_i) g=gcd(g,ai),否则令 g = g c d ( g , b i ) g=gcd(g,b_i) g=gcd(g,bi),最终得到的 g g g即为答案。
- 时间复杂度 O ( N L o g V ) O(NLogV) O(NLogV)。
【代码】
#include<bits/stdc++.h> using namespace std; const int MAXN = 150005; template <typename T> void chkmax(T &x, T y) { x = max(x, y); } template <typename T> void chkmin(T &x, T y) { x = min(x, y); } template <typename T> void read(T &x) { x = 0; int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; x *= f; } template <typename T> void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x