Atcoder Beginner Contest 414
晚上去吃火锅了,到家都九点半了,成功错过这一场。还好报了 Unrated。
E
神秘计数题。
这东西看着就必须根号才能过,而且很能写成整除分块的形式。
然后要先考虑枚举一个数再确定剩下两个数,感觉过去枚举 \(b\) 最好,然后你发现 \(a = kb + c\),于是如果你确定了 \(a\) 那 \(c\) 也唯一确定。于是就相当于统计大于 \(a\) 且不为 \(b\) 的倍数的 \(a\) 的数量。
\(\sum_{b = 1}^{N} N - b - (\lfloor \frac{N}{b} \rfloor - 1) = \frac{N(N + 1)}{2} - \sum_{b = 1}^N \lfloor \frac{N}{B} \rfloor\)
整除分块就做完了。
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i <= (b); i ++)
#define fro(i, a, b) for (int i = (a); i >= b; i --)
#define INF 0x3f3f3f3f
#define eps 1e-6
#define lowbit(x) (x & (-x))
#define reg register
#define IL inline
typedef long long LL;
typedef std::pair<int, int> PII;
#define int __int128
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
return x * f;
}
const int Mod = 998244353;
int n;
inline int qmi(int a, int b = Mod - 2) {
int res = 1;
while (b) {
if (b & 1) res = res * a % Mod;
b >>= 1; a = a * a % Mod;
}
return res;
}
signed main() {
n = read();
int ans = n % Mod * (n - 1) % Mod * qmi(2) % Mod;
for (int l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
ans = ((ans - (r - l + 1) % Mod * (n / l) % Mod) % Mod + Mod) % Mod;
}
cout << (LL)ans << endl;
return 0;
}
F
显然直接 BFS 即可。
然后随便做的话复杂度炸掉了,于是你考虑把每个点拆成 \(k\) 个点,根据到每个点行走的距离决定经过哪个点。
然后你发现如果从 \((fa, k)\) 走到了 \((u, k + 1)\),那么我们其实可以再走一步就到了 \((v, k + 2)\),所以在走完这一步后 \((u, k + 1)\) 这个点就没用了,把这个点所连的所有边都删掉只留下往父亲的边即可。
可以画个图观察一下 ,还是很好做的。
G
待补

浙公网安备 33010602011771号