1 条题解

  • 0
    @ 2022-8-29 9:17:38
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    inline int read() {
        char c = getchar(); int x = 0;
        while (c < '0' || c > '9') { c = getchar(); }
        while (c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c & 15); c = getchar(); }
        return x;
    }
    
    const int maxN = 100005, maxR = 12;
    
    int n, m, p, f[3][maxN], g[3][maxR][maxN];
    
    struct List {
        int len, fst[maxN], nxt[maxN << 1], to[maxN << 1];
    
        List() { memset(fst, -1, sizeof(fst)); }
        inline void insert(int u, int v) { nxt[len] = fst[u]; to[len] = v; fst[u] = len++; }
        inline void link(int u, int v) { insert(u, v); insert(v, u); }
    } e;
    
    inline int add(int x, int y) { x += y; return x >= p ? x - p : x; }
    inline int mul(int x, int y) { return (long long) x * y % p; }
    
    void dfs1(int u, int fa) {
        f[0][u] = 1; f[1][u] = f[2][u] = 1e9;
        for (int i = e.fst[u], v; ~i; i = e.nxt[i]) {
            v = e.to[i];
            if (v == fa) { continue; } dfs1(v, u);
            f[2][u] = std::min(std::max(f[2][u], f[2][v] + 1), std::max(f[1][u], f[1][v]));
            f[1][u] = std::min(std::max(f[1][u], f[2][v] + 1), std::max(f[0][u], f[1][v]));
            f[0][u] = std::max(f[0][u], f[2][v] + 1);
        }
        f[1][u] = std::min(f[0][u], f[1][u]); f[2][u] = std::min(f[1][u], f[2][u]);
    }
    void dfs2(int u, int fa) {
        for (int i = 1; i <= f[2][1]; i++) { g[0][i][u] = 1; }
        for (int i = e.fst[u], v; ~i; i = e.nxt[i]) {
            v = e.to[i];
            if (v == fa) { continue; } dfs2(v, u);
            for (int i = 1; i <= f[2][1]; i++) {
                g[2][i][u] = add(mul(g[2][i][u], g[2][i - 1][v]), mul(g[1][i][u], g[1][i][v]));
                g[1][i][u] = add(mul(g[1][i][u], g[2][i - 1][v]), mul(g[0][i][u], g[1][i][v]));
                g[0][i][u] = mul(g[0][i][u], g[2][i - 1][v]);
            }
        }
        for (int i = 1; i <= f[2][1]; i++) { g[1][i][u] = add(g[0][i][u], g[1][i][u]); g[2][i][u] = add(g[1][i][u], g[2][i][u]); }
    }
    
    int main() {
        n = read(); m = read(); p = read();
        if (m != n - 1) { printf("-1\n-1\n"); return 0; }
        for (int i = 1; i <= m; i++) { e.link(read(), read()); }
        dfs1(1, 0); dfs2(1, 0);
        printf("%d\n%d\n", f[2][1] - 1, g[2][f[2][1]][1]);
        return 0;
    }
    
    • 1

    信息

    ID
    1063
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    11
    已通过
    4
    上传者