[{"data":1,"prerenderedAt":12},["ShallowReactive",2],{"article-6":3},{"id":4,"title":5,"summary":6,"tags":7,"publishedAt":10,"content":11},6,"ABC456参加録","ABC456の参加記録",["Reactive",8],[9],"競技プログラミング","2026-05-02","# ABC456 (Promotion of AtCoder Career Design DAY)参加録\r\n\r\n結構実装が大変な回だった気がした。  \r\n今回もDまではすんなりいけ、Eも方針は思いついたものの実装しきれず。 \r\n\r\n## A: [Dice](https://atcoder.jp/contests/abc456/tasks/abc456_a)\r\n3未満、19以上の目はサイコロ3つの和では実現できない。  \r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    X = int(input())\r\n    if 3 \u003C= X \u003C= 18: print(\"Yes\")\r\n    else: print(\"No\")\r\n\r\n    return 0\r\n```\r\n\r\n## B: [456](https://atcoder.jp/contests/abc456/tasks/abc456_b)\r\nゴリラ実装。  \r\nB問題なので。  \r\n6^3通りの出目のうち、(4, 5, 6)の組み合わせとなる出目の数を求める。\r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    A = list(map(int, input().split()))\r\n    B = list(map(int, input().split()))\r\n    C = list(map(int, input().split()))\r\n    total = 0\r\n    # 4, 5, 6\r\n    total += A.count(4) * B.count(5) * C.count(6)\r\n    # 4, 6, 5\r\n    total += A.count(4) * B.count(6) * C.count(5)\r\n    # 5, 4, 6\r\n    total += A.count(5) * B.count(4) * C.count(6)\r\n    # 5, 6, 4\r\n    total += A.count(5) * B.count(6) * C.count(4)\r\n    # 6, 4, 5\r\n    total += A.count(6) * B.count(4) * C.count(5)\r\n    # 6, 5, 4\r\n    total += A.count(6) * B.count(5) * C.count(4)\r\n\r\n    print(total / (6 * 6 * 6))\r\n\r\n    return 0\r\n```\r\n\r\n## C: [Not Adjacent](https://atcoder.jp/contests/abc456/tasks/abc456_c)\r\n同じ文字が連続しない区間を伸ばせるだけ伸ばすと、その区間内でとれる全ての区間は条件を満たす。  \r\nあらかじめLまでの三角数を求めておくことで高速に計算できる。  \r\n変数名がfactorialになっているのは最初三角数ではなく階乗を計算してしまっていたため(苦笑)\r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    S = input().strip(\"\\n\")\r\n    count = 0\r\n    mod = 998244353\r\n    pre = \"\"\r\n    left = 0\r\n    L = len(S)\r\n    factorial = [1] * (L + 1)\r\n    for i in range(2, L+1):\r\n        factorial[i] = (i + factorial[i-1]) % mod\r\n\r\n    while left \u003C L:\r\n        right = left\r\n        while right \u003C L and S[right] != pre:\r\n            pre = S[right]\r\n            right += 1\r\n        # print(f\"Right: {right}, Left: {left}\")\r\n        count += factorial[right - left]\r\n        pre = \"\"\r\n        left = right\r\n        \r\n    print(count)\r\n\r\n    return 0\r\n```\r\n\r\n## D: [Not Adjacent 2](https://atcoder.jp/contests/abc456/tasks/abc456_d)\r\nDPでi番目時点での最後に使った文字毎に何通りあるのかを管理する。    \r\ni番目の文字を使う場合/使わない場合を考える。    \r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    S = input().strip(\"\\n\")\r\n    L = len(S)\r\n    mod = 998244353\r\n    D = {\"a\": 0, \"b\": 1, \"c\": 2}\r\n    DP = [[0, 0, 0] for _ in range(L)]\r\n    init = D[S[0]]\r\n    DP[0][init] = 1\r\n    for i in range(1, L):\r\n        s = S[i]\r\n        idx = D[s]\r\n        # 初めて使う\r\n        DP[i][idx] = 1\r\n\r\n        for j in range(3):\r\n            # この文字を使う場合\r\n            if j != idx:\r\n                DP[i][idx] = (DP[i][idx] + DP[i-1][j]) % mod\r\n\r\n            # この文字を使わない場合\r\n            DP[i][j] = (DP[i][j] + DP[i-1][j]) % mod\r\n    \r\n    print(sum(DP[L-1]) % mod)\r\n\r\n    return 0\r\n```\r\n\r\n## E: [Endless Holidays](https://atcoder.jp/contests/abc455/tasks/abc455_e)\r\nある都市にいるときに移動できる都市は次の日休日の都市のみなので、w曜日における移動経路を管理しておき、N都市 * W曜日を頂点とするグラフにおけるループ検出ができるとよい。    \r\nデータの保持の仕方やらループ検出方法やらで実装に時間がかかり、方針は思いついたものの時間内に提出できなかった...  \r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    T = int(input())\r\n    ans = [\"No\" for _ in range(T)]\r\n    for t in range(T):\r\n        N, M = map(int, input().split())\r\n        E =[[] for _ in range(N)]\r\n        for i in range(M):\r\n            u, v = map(int, input().split())\r\n            E[u-1].append(v-1)\r\n            E[v-1].append(u-1)\r\n\r\n        W = int(input())\r\n        WN = [[] for _ in range(W)]\r\n        WE = [[[] for n in range(N)] for _ in range(W)]\r\n\r\n        S = [input().strip(\"\\n\") for _ in range(N)]\r\n        for i, s in enumerate(S):\r\n            for j in range(W):\r\n                if s[j] == \"o\":\r\n                    WN[j].append(i)\r\n        for i, e in enumerate(E):\r\n            ns = S[i]\r\n            for ne in e:\r\n                s = S[ne]\r\n                for w in range(W):\r\n                    if ns[w] == \"o\" and s[(w+1)%W] == \"o\":\r\n                        WE[w][i].append(ne)\r\n        \r\n        \r\n        def dfs(w, n, VD, FD):\r\n            cycle = False\r\n            VD[(w, n)] = True\r\n            nd = (w+1)%W\r\n            nes = WE[w][n]\r\n            if S[n][nd] == \"o\":\r\n                nes.append(n)\r\n            \r\n            for ne in nes:\r\n                if not VD[(nd, ne)]:\r\n                    cycle |= dfs(nd, ne, VD, FD)\r\n                elif not FD[(nd, ne)]:\r\n                    cycle = True\r\n            FD[(w, n)] = True\r\n            return cycle\r\n\r\n        VD = {}\r\n        FD = {}\r\n        for w, nodes in enumerate(WN):\r\n            for n in nodes:\r\n                VD[(w, n)] = False\r\n                FD[(w, n)] = False\r\n        \r\n        for n in WN[0]:\r\n            if not VD[(0, n)]:\r\n                if dfs(0, n, VD, FD):\r\n                    ans[t] = \"Yes\"\r\n                    break\r\n        else:\r\n            ans[t] = \"No\"\r\n\r\n    \r\n    print(*ans, sep=\"\\n\")\r\n\r\n\r\n    return 0\r\n```",1779712439333]