Submission #21369345


Source Code Expand

import sys
import numpy as np

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

MOD = 998_244_353

def from_read(dtype=np.int64):
    return np.fromstring(read().decode(), dtype=dtype, sep=' ')


def from_readline(dtype=np.int64):
    return np.fromstring(readline().decode(), dtype=dtype, sep=' ')

def fact_table(N=1 << 20):
    N += 1
    fact = np.empty(N, np.int64)
    fact[0] = 1
    for n in range(1, N):
        fact[n] = n * fact[n - 1] % MOD
    fact_inv = np.empty(N, np.int64)
    fact_inv[N - 1] = pow(int(fact[N - 1]), -1, MOD)
    for n in range(N - 1, 0, -1):
        fact_inv[n - 1] = fact_inv[n] * n % MOD
    inv = np.empty(N, np.int64)
    inv[0] = 0
    inv[1:] = fact[:-1] * fact_inv[1:] % MOD
    return fact, fact_inv, inv

def fft_convolve(f, g):
    """
    数列 (多項式) f, g の畳み込みの計算.上下 15 bitずつ分けて計算することで,
    30 bit以下の整数,長さ 250000 程度の数列での計算が正確に行える.
    """
    Lf, Lg = f.shape[-1], g.shape[-1]
    L = Lf + Lg - 1
    fft_len = 1 << L.bit_length()
    fh, fl = f >> 15, f & (1 << 15) - 1
    gh, gl = g >> 15, g & (1 << 15) - 1

    Ffh = np.fft.rfft(fh, fft_len)
    Ffl = np.fft.rfft(fl, fft_len)
    Fgh = np.fft.rfft(gh, fft_len)
    Fgl = np.fft.rfft(gl, fft_len)

    a = np.rint(np.fft.irfft(Ffh * Fgh)).astype(np.int64) % MOD
    b = np.rint(np.fft.irfft(Ffh * Fgl + Ffl * Fgh)).astype(np.int64) % MOD
    c = np.rint(np.fft.irfft(Ffl * Fgl)).astype(np.int64) % MOD
    h = (a << 30) + (b << 15) + c
    return h[:L] % MOD

def main(N, M):
    fact, fact_inv, inv = fact_table(N + M + 10)
    C = fact[N] * fact_inv[:N + 1] % MOD * fact_inv[:N + 1][::-1] % MOD
    C = C[::2]
    C = np.append(C, np.zeros(M, np.int64))
    """
    和 → 数え
    """
    dp = np.ones(1, np.int64)
    dp[0] = 1
    while len(dp) <= M:
        newdp = np.zeros(2 * len(dp), np.int64)
        newdp[::2] = fft_convolve(dp, C[:len(dp)])[:len(dp)]
        dp = newdp
    return dp[M]

N, M = from_read()
print(main(N, M))

Submission Info

Submission Time
Task D - I Wanna Win The Game
User maspy
Language Python (3.8.2)
Score 500
Code Size 2175 Byte
Status AC
Exec Time 127 ms
Memory 27908 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 3
AC × 69
Set Name Test Cases
Sample 00-Sample-00, 00-Sample-01, 00-Sample-02
All 00-Sample-00, 00-Sample-01, 00-Sample-02, 01-Handmade-00, 01-Handmade-01, 01-Handmade-02, 01-Handmade-03, 01-Handmade-04, 01-Handmade-05, 02-Small-00, 02-Small-01, 02-Small-02, 02-Small-03, 02-Small-04, 02-Small-05, 02-Small-06, 02-Small-07, 02-Small-08, 02-Small-09, 02-Small-10, 02-Small-11, 02-Small-12, 02-Small-13, 02-Small-14, 02-Small-15, 02-Small-16, 02-Small-17, 02-Small-18, 02-Small-19, 03-Large-00, 03-Large-01, 03-Large-02, 03-Large-03, 03-Large-04, 03-Large-05, 03-Large-06, 03-Large-07, 03-Large-08, 03-Large-09, 03-Large-10, 03-Large-11, 03-Large-12, 03-Large-13, 03-Large-14, 03-Large-15, 03-Large-16, 03-Large-17, 03-Large-18, 03-Large-19, 03-Large-20, 03-Large-21, 03-Large-22, 03-Large-23, 03-Large-24, 03-Large-25, 03-Large-26, 03-Large-27, 03-Large-28, 03-Large-29, 03-Large-30, 03-Large-31, 03-Large-32, 03-Large-33, 03-Large-34, 03-Large-35, 03-Large-36, 03-Large-37, 03-Large-38, 03-Large-39
Case Name Status Exec Time Memory
00-Sample-00 AC 117 ms 26852 KiB
00-Sample-01 AC 107 ms 26932 KiB
00-Sample-02 AC 119 ms 27416 KiB
01-Handmade-00 AC 108 ms 26980 KiB
01-Handmade-01 AC 117 ms 27716 KiB
01-Handmade-02 AC 114 ms 27376 KiB
01-Handmade-03 AC 123 ms 27776 KiB
01-Handmade-04 AC 110 ms 26800 KiB
01-Handmade-05 AC 116 ms 27212 KiB
02-Small-00 AC 111 ms 27044 KiB
02-Small-01 AC 110 ms 27072 KiB
02-Small-02 AC 109 ms 26932 KiB
02-Small-03 AC 108 ms 26936 KiB
02-Small-04 AC 112 ms 26928 KiB
02-Small-05 AC 109 ms 27052 KiB
02-Small-06 AC 108 ms 26928 KiB
02-Small-07 AC 110 ms 27184 KiB
02-Small-08 AC 108 ms 26924 KiB
02-Small-09 AC 109 ms 27012 KiB
02-Small-10 AC 110 ms 27200 KiB
02-Small-11 AC 111 ms 26948 KiB
02-Small-12 AC 109 ms 26948 KiB
02-Small-13 AC 106 ms 26816 KiB
02-Small-14 AC 108 ms 26976 KiB
02-Small-15 AC 110 ms 26928 KiB
02-Small-16 AC 107 ms 27020 KiB
02-Small-17 AC 109 ms 26928 KiB
02-Small-18 AC 109 ms 27008 KiB
02-Small-19 AC 108 ms 26824 KiB
03-Large-00 AC 121 ms 27704 KiB
03-Large-01 AC 121 ms 27908 KiB
03-Large-02 AC 116 ms 27372 KiB
03-Large-03 AC 115 ms 27256 KiB
03-Large-04 AC 118 ms 27576 KiB
03-Large-05 AC 127 ms 27764 KiB
03-Large-06 AC 126 ms 27868 KiB
03-Large-07 AC 120 ms 27260 KiB
03-Large-08 AC 112 ms 27212 KiB
03-Large-09 AC 116 ms 27532 KiB
03-Large-10 AC 113 ms 27156 KiB
03-Large-11 AC 121 ms 27672 KiB
03-Large-12 AC 121 ms 27376 KiB
03-Large-13 AC 116 ms 27200 KiB
03-Large-14 AC 114 ms 26944 KiB
03-Large-15 AC 116 ms 27200 KiB
03-Large-16 AC 116 ms 27488 KiB
03-Large-17 AC 113 ms 27180 KiB
03-Large-18 AC 118 ms 27312 KiB
03-Large-19 AC 115 ms 27184 KiB
03-Large-20 AC 120 ms 27796 KiB
03-Large-21 AC 122 ms 27896 KiB
03-Large-22 AC 123 ms 27776 KiB
03-Large-23 AC 116 ms 27536 KiB
03-Large-24 AC 113 ms 27268 KiB
03-Large-25 AC 122 ms 27404 KiB
03-Large-26 AC 117 ms 27152 KiB
03-Large-27 AC 116 ms 27444 KiB
03-Large-28 AC 117 ms 27472 KiB
03-Large-29 AC 126 ms 27828 KiB
03-Large-30 AC 112 ms 27168 KiB
03-Large-31 AC 117 ms 27568 KiB
03-Large-32 AC 119 ms 27356 KiB
03-Large-33 AC 120 ms 27504 KiB
03-Large-34 AC 122 ms 27692 KiB
03-Large-35 AC 116 ms 27364 KiB
03-Large-36 AC 112 ms 27260 KiB
03-Large-37 AC 118 ms 27472 KiB
03-Large-38 AC 121 ms 27332 KiB
03-Large-39 AC 115 ms 27300 KiB