QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#100917#5827. 异或图Scintilla30 10ms7960kbC++143.3kb2023-04-28 17:37:532023-04-28 17:37:54

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-28 17:37:54]
  • 评测
  • 测评结果:30
  • 用时:10ms
  • 内存:7960kb
  • [2023-04-28 17:37:53]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define rep(i, s, e) for (int i = s; i <= e; ++i)
#define drep(i, s, e) for (int i = s; i >= e; --i)
#define file(a) freopen(#a".in", "r", stdin), freopen(#a".out", "w", stdout)
#define pv(a) cout << #a << " = " << a << endl
#define pa(a, l, r) cout << #a " : "; rep(_, l, r) cout << a[_] << ' '; cout << endl

const int P = 998244353;

const int N = 16;
const int M = 1 << N;
const int K = 14348907;
const int L = 60;

int read() {
  int x = 0, f = 1; char c = getchar();
  for (; c < '0' || c > '9'; c = getchar()) if (c == '-') f = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - 48;
  return x * f;
}

int inc(int a, int b) { return (a += b) >= P ? a - P : a; }
int dec(int a, int b) { return (a -= b) < 0 ? a + P : a; }
int mul(int a, int b) { return 1ll * a * b % P; }
void add(int &a, int b) { (a += b) >= P ? a -= P : 1; }
void sub(int &a, int b) { (a -= b) < 0 ? a += P : 1; }
int sgn(int x) { return x & 1 ? P - 1 : 1; }
int qpow(int a, int b) { int res = 1; for (; b; b >>= 1, a = mul(a, a)) if (b & 1) res = mul(res, a); return res; }

int n, m, c, a[N], id[N], rk[N], e[N], f[M], g[M], pw[N], dat[M], h[K], ans;

int dig(int x, int k) {
  return (x / pw[k]) % 3;
}

int dp[N][2][2];
int calc(vector <int> val) {
  int m = val.size(), s = 0, res = 0;
  for (int x : val) s ^= x;
  drep(i, L - 1, 0) {
    memset(dp, 0, sizeof(dp));
    dp[0][0][0] = 1;
    rep(j, 0, m - 1) rep(x, 0, 1) rep(y, 0, 1) {
      add(dp[j + 1][x ^ (val[j] >> i & 1)][y], mul(dp[j][x][y], (val[j] & ((1ll << i) - 1)) % P));
      if (val[j] >> i & 1) {
        add(dp[j + 1][x][1], mul(dp[j][x][y], y ? ((1ll << i) % P) : 1));
      }
    }
    add(res, dp[m][c >> i & 1][1]);
    if ((s >> i & 1) != (c >> i & 1)) break;
  }
  return res;
}

signed main() {
  n = read(), m = read(), c = read();
  pw[0] = 1;
  rep(i, 1, n) pw[i] = mul(pw[i - 1], 3);
  rep(i, 0, n - 1) a[i] = read() + 1, id[i] = i;
  sort(id, id + n, [&](int i, int j) { return a[i] < a[j]; });
  rep(i, 0, n - 1) rk[id[i]] = i;
  sort(a, a + n);
  rep(i, 1, m) {
    int u = rk[read() - 1], v = rk[read() - 1];
    e[u] |= 1 << v, e[v] |= 1 << u;
  }
  for (int s = 0; s < 1 << n; ++ s) {
    g[s] = 1;
    rep(i, 0, n - 1) if (s >> i & 1) {
      g[s] &= !__builtin_popcount(e[i] & s);
      dat[s] += pw[i];
    }
    f[s] = g[s];
    if (!s) continue;
    int p = __lg(s & -s);
    for (int t = s & s - 1; t; t = s & t - 1) {
      if (!(t >> p & 1)) continue;
      sub(f[s], mul(f[t], g[s ^ t]));
    }
  }
  h[0] = 1;
  for (int s = 0; s < pw[n]; ++ s) if (h[s]) {
    auto mn = [&]() {
      rep(i, 0, n - 1) if (!dig(s, i)) return i;
      return -1ll;
    } ;
    int p = mn();
    if (!~p) {
      vector <int> val;
      rep(i, 0, n - 1) if (dig(s, i) == 2) val.emplace_back(a[i]);
      add(ans, mul(h[s], calc(val)));
    }
    else {
      int r = 0;
      rep(i, p, n - 1) if (!dig(s, i)) r |= 1 << i;
      for (int t = r; t; t = r & t - 1) {
        if (!(t >> p & 1)) continue;
        if (__builtin_parity(t)) {
          add(h[s + dat[t] + pw[p]], mul(h[s], f[t]));
        }
        else {
          add(h[s + dat[t]], mul(h[s], mul(f[t], a[p])));
        }
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 20
Accepted

Test #1:

score: 20
Accepted
time: 2ms
memory: 3588kb

input:

4 6 2
7 11 14 0
1 2
1 3
2 3
2 4
4 1
4 3

output:

44

result:

ok 1 number(s): "44"

Test #2:

score: 0
Accepted
time: 2ms
memory: 3476kb

input:

4 4 6
12 14 14 5
4 2
1 4
3 2
1 2

output:

798

result:

ok 1 number(s): "798"

Test #3:

score: 0
Accepted
time: 2ms
memory: 5508kb

input:

3 3 2
10 4 11
2 1
3 2
1 3

output:

33

result:

ok 1 number(s): "33"

Test #4:

score: 0
Accepted
time: 2ms
memory: 5508kb

input:

4 0 4
9 8 5 2

output:

148

result:

ok 1 number(s): "148"

Test #5:

score: 0
Accepted
time: 0ms
memory: 5636kb

input:

5 6 14
12 15 13 13 12
3 1
2 4
2 5
2 1
5 3
4 5

output:

21337

result:

ok 1 number(s): "21337"

Test #6:

score: 0
Accepted
time: 2ms
memory: 3500kb

input:

4 5 5
5 2 4 13
2 1
3 4
1 4
4 2
3 2

output:

42

result:

ok 1 number(s): "42"

Test #7:

score: 0
Accepted
time: 0ms
memory: 3596kb

input:

4 4 3
13 7 8 12
4 1
3 1
2 4
4 3

output:

552

result:

ok 1 number(s): "552"

Test #8:

score: 0
Accepted
time: 2ms
memory: 5548kb

input:

4 2 12
1 12 4 11
2 1
3 1

output:

70

result:

ok 1 number(s): "70"

Test #9:

score: 0
Accepted
time: 0ms
memory: 3480kb

input:

5 5 6
10 7 8 2 13
1 5
1 3
2 1
4 3
5 3

output:

1231

result:

ok 1 number(s): "1231"

Test #10:

score: 0
Accepted
time: 2ms
memory: 3488kb

input:

5 7 9
6 7 13 15 12
1 3
5 3
5 2
4 5
4 3
4 1
3 2

output:

6223

result:

ok 1 number(s): "6223"

Test #11:

score: 0
Accepted
time: 2ms
memory: 5640kb

input:

3 0 3
15 7 12

output:

104

result:

ok 1 number(s): "104"

Test #12:

score: 0
Accepted
time: 2ms
memory: 5636kb

input:

3 2 9
10 6 5
1 2
1 3

output:

17

result:

ok 1 number(s): "17"

Test #13:

score: 0
Accepted
time: 0ms
memory: 5572kb

input:

5 5 11
7 9 15 9 9
5 4
5 1
5 2
1 3
3 4

output:

5224

result:

ok 1 number(s): "5224"

Test #14:

score: 0
Accepted
time: 0ms
memory: 3548kb

input:

5 0 12
9 8 14 11 2

output:

3006

result:

ok 1 number(s): "3006"

Test #15:

score: 0
Accepted
time: 2ms
memory: 3500kb

input:

3 1 1
6 10 4
3 1

output:

30

result:

ok 1 number(s): "30"

Subtask #2:

score: 0
Wrong Answer

Dependency #1:

100%
Accepted

Test #16:

score: 0
Wrong Answer
time: 1ms
memory: 5648kb

input:

9 27 705410105529944560
929827299070190972 733413770730537329 473007347105710981 190062421504120247 918561152768663129 196040702922254016 981530663192980241 203295856357272834 337150461958783092
2 8
7 9
8 9
2 3
9 2
2 7
9 5
9 4
4 8
1 7
6 3
6 1
4 1
6 5
2 4
2 1
9 3
9 6
7 3
7 5
5 2
4 5
2 6
3 1
3 8
4 3
8 6

output:

824717695

result:

wrong answer 1st numbers differ - expected: '5392583', found: '824717695'

Subtask #3:

score: 10
Accepted

Test #47:

score: 10
Accepted
time: 10ms
memory: 7960kb

input:

14 0 731833687287532167
157552918690640051 900457311668526045 111217720157614956 84140984111060473 814012186135880499 784848789620248379 958953377683017264 105083874298571687 104921429970878846 44983041675142735 871013110538758030 686733907990421995 98063590462078176 495161493555059993

output:

231790380

result:

ok 1 number(s): "231790380"

Test #48:

score: 0
Accepted
time: 1ms
memory: 3848kb

input:

11 0 101435837408688522
638776638580507479 933944392115323974 19098604312360490 142362319980029593 419910251764515410 275591812677260089 770239593400917018 928344484461634421 67340905784404712 378109786925249078 110881245457449811

output:

242383534

result:

ok 1 number(s): "242383534"

Test #49:

score: 0
Accepted
time: 2ms
memory: 5700kb

input:

9 0 100988561775675251
622570387572403506 684352103903274038 784649864569409753 270298495621205212 56183537059869110 346856482529145989 86639702870530669 607198038565138736 14747634008501988

output:

20893166

result:

ok 1 number(s): "20893166"

Test #50:

score: 0
Accepted
time: 1ms
memory: 5656kb

input:

10 0 839910859917247463
611237879350518457 292219463776059962 548211857317940894 822255554598388425 335628456629874391 774414280870858683 882480367082748768 654587410087321403 74330774886125511 22894883233341926

output:

61697734

result:

ok 1 number(s): "61697734"

Subtask #4:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%