QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#129693#4540. Counting Stickmenbatrr#AC ✓582ms39724kbC++172.1kb2023-07-22 22:11:422023-07-22 22:11:44

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-22 22:11:44]
  • Judged
  • Verdict: AC
  • Time: 582ms
  • Memory: 39724kb
  • [2023-07-22 22:11:42]
  • Submitted

answer

#include <bits/stdc++.h>

#define f first
#define s second
#define pb push_back
#define mp make_pair

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;

const int N = 300500, inf = 1e9, mod = 998244353;
const ll INF = 1e18;

int sum(int a, int b) {
    a += b;
    if (a >= mod)
        a -= mod;
    return a;
}

int sub(int a, int b) {
    a -= b;
    if (a < 0)
        a += mod;
    return a;
}

int mult(int a, int b) {
    return 1ll * a * b % mod;
}

int bp(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1)
            res = mult(res, a);
        a = mult(a, a);
        b >>= 1;
    }
    return res;
}

int inv(int x) {
    return bp(x, mod - 2);
}

int n;
const int maxN = 5e5 + 10;
vector<int> g[maxN];
int deg[maxN];
int S[16];
int D[4];
void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        deg[i] = 0;
        g[i].clear();
    }
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        g[a].emplace_back(b);
        g[b].emplace_back(a);
        deg[a]++;
        deg[b]++;
    }
    const int inv2 = (mod + 1) / 2;
    int ANS = 0;
    for (int i = 1; i <= n; i++) {
        if ((int)g[i].size() < 4) continue;
        memset(S, 0, sizeof S);
        S[0] = 1;
        for (int to : g[i]) {
            D[0] = 1;
            D[1] = deg[to] - 1;
            D[2] = deg[to] - 1;
            D[3] = mult(inv2, mult(deg[to] - 1, deg[to] - 2));
            for (int z = 15; z >= 0; z--) {
                for (int bit = 0; bit < 4; bit++) {
                    if (!(z & (1 << bit))) {
                        S[z ^ (1 << bit)] = sum(S[z ^ (1 << bit)], mult(S[z], D[bit]));
                    }
                }
            }
        }
        ANS = sum(ANS, mult(S[15], inv2));
    }
    cout << ANS << '\n';

}

int main() {
#ifdef DEBUG
    freopen("input.txt", "r", stdin);
#endif
    ios_base::sync_with_stdio(false);
    int t = 1;
    cin >> t;
    for (int i = 1; i <= t; i++) {
//        cout << "Case #" << i << endl;
        solve();
    }
}

詳細信息

Test #1:

score: 100
Accepted
time: 582ms
memory: 39724kb

input:

15
9
1 2
2 3
3 4
2 5
5 6
2 7
7 8
7 9
9999
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
1 21
1 22
1 23
1 24
1 25
1 26
1 27
1 28
1 29
1 30
1 31
1 32
1 33
1 34
1 35
1 36
1 37
1 38
1 39
1 40
1 41
1 42
1 43
1 44
1 45
1 46
1 47
1 48
1 49
1 50
1 51
1 52
1 53
1 54
1...

output:

1
311255965
672169659
323323769
834196165
147532751
608867683
433545054
268282647
580524749
250163191
0
876200211
781358751
903681473

result:

ok 15 lines