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)\) 这个点就没用了,把这个点所连的所有边都删掉只留下往父亲的边即可。

可以画个图观察一下 ,还是很好做的。

Submission #67570990

G

待补

posted @ 2025-07-13 09:32  比翼の鼠  阅读(45)  评论(0)    收藏  举报