提出 #39793562


ソースコード 拡げる

mod = 998244353
inv = [pow(i, mod - 2, mod) for i in range(50)]

def fast_pow(f, k, deg):
  assert f[0] == 1
  d = len(f) - 1
  g = [0] * deg
  g[0] = 1
  for a in range(1, deg):
    co = (k + 1 - a) % mod
    for i in range(1, min(a, d) + 1):
      g[a] += f[i] * g[a - i] % mod * co
      g[a] %= mod
      co = (co + k + 1) % mod
    g[a] *= inv[a]
    g[a] %= mod
  return g

def subset_pow(f, K):
  N = len(f).bit_length() - 1
  M = 1 << N
  assert len(f) == M
  pc = [0] * M
  for i in range(M):
    pc[i] = pc[i // 2] + i % 2

  F = [0] * ((N + 1) * M)
  for i in range(M):
    F[i * (N + 1) + pc[i]] = f[i]
  for lg in range(N):
    i = 1 << lg
    for j in range(0, M, 2 * i):
      for k in range(i):
        x = (j + k) * (N + 1)
        y = (i + j + k) * (N + 1)
        for l in range(N + 1):
          F[y + l] += F[x + l]
          F[y + l] %= mod

  K %= mod
  for i in range(M):
    a = F[i * (N + 1):(i + 1) * (N + 1)]
    b = fast_pow(a, K, N + 1)
    for j in range(N + 1):
      F[i * (N + 1) + j] = b[j]

  for lg in range(N):
    i = 1 << lg
    for j in range(0, M, 2 * i):
      for k in range(i):
        x = (j + k) * (N + 1)
        y = (i + j + k) * (N + 1)
        for l in range(N + 1):
          F[y + l] -= F[x + l]
          F[y + l] %= mod
  g = [0] * M
  for i in range(M):
    g[i] = F[i * (N + 1) + pc[i]]
  return g


def solve_sp(N, K, es):
  adj = [[0 for j in range(N)]for i in range(N)]
  for u, v in es:
    adj[u][v] = adj[v][u] = 1
  f = [0] * (1 << N)
  for i in range(1 << N):
    ok = 1
    for j in range(N):
      for k in range(j):
        if (i >> j) % 2 and (i >> k) % 2 and adj[j][k]:
          ok = 0
    f[i] = ok
  g = subset_pow(f, K)
  return g[-1]


import copy

def solve(N, K, _es):
  es = copy.deepcopy(_es)
  for uv in es:
    assert 0 <= uv[0] and uv[0] < N
    assert 0 <= uv[1] and uv[1] < N
    if uv[0] == uv[1]:
      return 0
  if N == 0:
    return 1

  def ch(u, v):
    for i in range(len(es)):
      if es[i][0] == u or es[i][0] == v:
        es[i][0] = u + v - es[i][0]
      if es[i][1] == u or es[i][1] == v:
        es[i][1] = u + v - es[i][1]

  deg = [0 for _ in range(N)]
  for uv in es:
    deg[uv[0]] += 1
    deg[uv[1]] += 1
  mindeg = min(deg)
  ch(deg.index(mindeg), N - 1)

  if mindeg == 0:
    return solve(N - 1, K, es) * K % mod
  if mindeg == 1:
    for j in range(len(es)):
      if max(es[j]) == N - 1:
        es.pop(j)
        break
    return solve(N - 1, K, es) * (K - 1) % mod
  if mindeg == 2:
    adj = []
    for _ in range(2):
      for j in range(len(es)):
        if max(es[j]) == N - 1:
          adj.append(es[j][0] + es[j][1] - (N - 1))
          es.pop(j)
          break
    assert len(adj) == 2
    if adj[0] == adj[1]:
      return solve(N - 1, K, es) * (K - 1) % mod
    adj.sort()
    ch(adj[1], N - 2)
    ch(adj[0], N - 3)
    ans = solve(N - 1, K, es) * (K - 2) % mod
    for j in range(len(es)):
      if es[j][0] == N - 2:
        es[j][0] = N - 3
      if es[j][1] == N - 2:
        es[j][1] = N - 3
    return (solve(N - 2, K, es) + ans) % mod

  return solve_sp(N, K, es)

def main():
  N, M, K = map(int, input().split())
  es = []
  for _ in range(M):
    u, v = map(int, input().split())
    es.append([u - 1, v - 1])
  print(solve(N, K, es))


main()

提出情報

提出日時
問題 Ex - K-Coloring
ユーザ Nyaan
言語 PyPy3 (7.3.0)
得点 600
コード長 3424 Byte
結果 AC
実行時間 5831 ms
メモリ 271888 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 5
AC × 61
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 02_n_max_00.txt, 02_n_max_01.txt, 02_n_max_02.txt, 03_m_max_00.txt, 03_m_max_01.txt, 03_m_max_02.txt, 03_m_max_03.txt, 04_tree_00.txt, 04_tree_01.txt, 05_path_00.txt, 05_path_01.txt, 06_cycle_00.txt, 06_cycle_01.txt, 07_broken_cycle_00.txt, 07_broken_cycle_01.txt, 07_broken_cycle_02.txt, 07_broken_cycle_03.txt, 07_broken_cycle_04.txt, 07_broken_cycle_05.txt, 07_broken_cycle_06.txt, 07_broken_cycle_07.txt, 07_broken_cycle_08.txt, 07_broken_cycle_09.txt, 07_broken_cycle_10.txt, 07_broken_cycle_11.txt, 08_star_00.txt, 08_star_01.txt, 09_double_star_00.txt, 09_double_star_01.txt, 10_deg_2_00.txt, 10_deg_2_01.txt, 11_deg_3_00.txt, 11_deg_3_01.txt, 11_deg_3_02.txt, 11_deg_3_03.txt, 12_deg_4_00.txt, 12_deg_4_01.txt, 13_deg_5_00.txt, 13_deg_5_01.txt, 14_deg_6_00.txt, 14_deg_6_01.txt, 15_deg_2_to_3_00.txt, 15_deg_2_to_3_01.txt, 15_deg_2_to_3_02.txt, 15_deg_2_to_3_03.txt, 16_deg_3_to_4_00.txt, 16_deg_3_to_4_01.txt, 16_deg_3_to_4_02.txt, 16_deg_3_to_4_03.txt, 16_deg_3_to_4_04.txt, 16_deg_3_to_4_05.txt, 17_perfect_00.txt, 17_perfect_01.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 90 ms 69348 KiB
00_sample_01.txt AC 63 ms 69320 KiB
00_sample_02.txt AC 64 ms 70184 KiB
00_sample_03.txt AC 65 ms 69492 KiB
00_sample_04.txt AC 67 ms 70556 KiB
01_random_00.txt AC 65 ms 69768 KiB
01_random_01.txt AC 72 ms 74212 KiB
01_random_02.txt AC 97 ms 75196 KiB
02_n_max_00.txt AC 68 ms 73628 KiB
02_n_max_01.txt AC 68 ms 69812 KiB
02_n_max_02.txt AC 69 ms 73604 KiB
03_m_max_00.txt AC 132 ms 76268 KiB
03_m_max_01.txt AC 148 ms 77456 KiB
03_m_max_02.txt AC 203 ms 79820 KiB
03_m_max_03.txt AC 167 ms 78272 KiB
04_tree_00.txt AC 72 ms 73840 KiB
04_tree_01.txt AC 71 ms 73656 KiB
05_path_00.txt AC 70 ms 73784 KiB
05_path_01.txt AC 71 ms 73600 KiB
06_cycle_00.txt AC 105 ms 75208 KiB
06_cycle_01.txt AC 100 ms 75236 KiB
07_broken_cycle_00.txt AC 120 ms 76028 KiB
07_broken_cycle_01.txt AC 125 ms 76112 KiB
07_broken_cycle_02.txt AC 116 ms 75692 KiB
07_broken_cycle_03.txt AC 213 ms 79324 KiB
07_broken_cycle_04.txt AC 97 ms 74904 KiB
07_broken_cycle_05.txt AC 79 ms 74432 KiB
07_broken_cycle_06.txt AC 90 ms 75128 KiB
07_broken_cycle_07.txt AC 84 ms 74352 KiB
07_broken_cycle_08.txt AC 102 ms 74912 KiB
07_broken_cycle_09.txt AC 105 ms 75108 KiB
07_broken_cycle_10.txt AC 104 ms 75188 KiB
07_broken_cycle_11.txt AC 103 ms 75388 KiB
08_star_00.txt AC 70 ms 73700 KiB
08_star_01.txt AC 74 ms 73668 KiB
09_double_star_00.txt AC 72 ms 73704 KiB
09_double_star_01.txt AC 70 ms 73724 KiB
10_deg_2_00.txt AC 107 ms 75276 KiB
10_deg_2_01.txt AC 119 ms 75908 KiB
11_deg_3_00.txt AC 5817 ms 271864 KiB
11_deg_3_01.txt AC 5812 ms 271816 KiB
11_deg_3_02.txt AC 5831 ms 271744 KiB
11_deg_3_03.txt AC 5817 ms 271888 KiB
12_deg_4_00.txt AC 287 ms 80132 KiB
12_deg_4_01.txt AC 275 ms 80132 KiB
13_deg_5_00.txt AC 115 ms 75500 KiB
13_deg_5_01.txt AC 115 ms 75444 KiB
14_deg_6_00.txt AC 100 ms 75568 KiB
14_deg_6_01.txt AC 99 ms 75468 KiB
15_deg_2_to_3_00.txt AC 151 ms 77412 KiB
15_deg_2_to_3_01.txt AC 233 ms 81232 KiB
15_deg_2_to_3_02.txt AC 1870 ms 141940 KiB
15_deg_2_to_3_03.txt AC 1883 ms 141632 KiB
16_deg_3_to_4_00.txt AC 677 ms 97456 KiB
16_deg_3_to_4_01.txt AC 349 ms 85556 KiB
16_deg_3_to_4_02.txt AC 665 ms 97392 KiB
16_deg_3_to_4_03.txt AC 668 ms 97512 KiB
16_deg_3_to_4_04.txt AC 137 ms 75696 KiB
16_deg_3_to_4_05.txt AC 137 ms 76056 KiB
17_perfect_00.txt AC 91 ms 74296 KiB
17_perfect_01.txt AC 103 ms 74976 KiB