提出 #71705392
ソースコード 拡げる
import sys
import string
import math
import bisect
import os
import heapq
import operator
from io import BytesIO, IOBase
from heapq import heappop,heappush
from functools import lru_cache,cache
from collections import deque,defaultdict,Counter,OrderedDict
from itertools import permutations,combinations
from array import array
INF = float('inf')
BUFSIZE = 8192
class FastIO(IOBase):
newlines = 0
def __init__(self, file):
self._file = file
self._fd = file.fileno()
self.buffer = BytesIO()
self.writable = "x" in file.mode or "r" not in file.mode
self.write = self.buffer.write if self.writable else None
def read(self):
while True:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
if not b:
break
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines = 0
return self.buffer.read()
def readline(self):
while self.newlines == 0:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
self.newlines = b.count(b"\n") + (not b)
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines -= 1
return self.buffer.readline()
def flush(self):
if self.writable:
os.write(self._fd, self.buffer.getvalue())
self.buffer.truncate(0), self.buffer.seek(0)
class IOWrapper(IOBase):
def __init__(self, file):
self.buffer = FastIO(file)
self.flush = self.buffer.flush
self.writable = self.buffer.writable
self.write = lambda s: self.buffer.write(s.encode("ascii"))
self.read = lambda: self.buffer.read().decode("ascii")
self.readline = lambda: self.buffer.readline().decode("ascii")
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = sys.stdin.buffer.readline
ask = lambda *x:print('?',*x,flush=True)
reply = lambda *x:print('!',*x,flush=True)
RI = lambda: int(sys.stdin.readline())
RF = lambda: float(sys.stdin.readline())
RS = lambda: sys.stdin.readline().strip()
RFF = lambda: map(float, sys.stdin.readline().split())
RII = lambda: map(int, sys.stdin.readline().split())
RSS = lambda: map(str, sys.stdin.readline().strip().split())
RIL = lambda: list(RII())
RFL = lambda: list(RFF())
RSL = lambda: list(RSS())
from types import GeneratorType
def bootstrap(f, stack=[]):
def wrappedfunc(*args, **kwargs):
if stack:
return f(*args, **kwargs)
else:
to = f(*args, **kwargs)
while True:
if type(to) is GeneratorType:
stack.append(to)
to = next(to)
else:
stack.pop()
if not stack:
break
to = stack[-1].send(to)
return to
return wrappedfunc
class NTT:
def __init__(self, mod=998244353, g=3):
self.mod = mod
self.g = g
self.roots = [0, 1]
self.inv_roots = [0, 1]
self._prepare_roots(20)
def _prepare_roots(self, n):
while len(self.roots) <= n:
k = len(self.roots)
root = pow(self.g, (self.mod - 1) // (1 << k), self.mod)
inv_root = pow(root, self.mod - 2, self.mod)
self.roots.append(root)
self.inv_roots.append(inv_root)
def _ntt(self, a, invert=False):
n = len(a)
if n == 1:
return
j = 0
for i in range(1, n):
bit = n >> 1
while j & bit:
j ^= bit
bit >>= 1
j ^= bit
if i < j:
a[i], a[j] = a[j], a[i]
length = 2
while length <= n:
k = length.bit_length() - 1
if k >= len(self.roots):
self._prepare_roots(k)
root = self.roots[k] if not invert else self.inv_roots[k]
for i in range(0, n, length):
w = 1
for j in range(i, i + length // 2):
u = a[j]
v = a[j + length // 2] * w % self.mod
a[j] = (u + v) % self.mod
a[j + length // 2] = (u - v) % self.mod
w = w * root % self.mod
length <<= 1
if invert:
inv_n = pow(n, self.mod - 2, self.mod)
for i in range(n):
a[i] = a[i] * inv_n % self.mod
def next_power_of_two(self, n):
if n <= 1:
return 1
return 1 << (n - 1).bit_length()
def poly_multiply(self, a, b):
if not a or not b:
return []
n = self.next_power_of_two(len(a) + len(b) - 1)
fa = a + [0] * (n - len(a))
fb = b + [0] * (n - len(b))
self._ntt(fa, False)
self._ntt(fb, False)
fc = [fa[i] * fb[i] % self.mod for i in range(n)]
self._ntt(fc, True)
result_len = len(a) + len(b) - 1
return fc[:result_len]
def convolution(self, a, b):
return self.poly_multiply(a, b)
def bostan_mori(self, P, Q, k):
"""
Bostan-Mori算法计算 [x^k] P(x)/Q(x)
参数:
P: 分子多项式系数列表,从低次项开始 [c0, c1, ..., cn]
Q: 分母多项式系数列表,从低次项开始 [c0, c1, ..., cm]
k: 需要计算的系数次数
返回:
系数值
"""
MOD = self.mod
max_len = max(len(P), len(Q))
P = P + [0] * (max_len - len(P))
Q = Q + [0] * (max_len - len(Q))
P = [x % MOD for x in P]
Q = [x % MOD for x in Q]
while k > 0:
Q_minus = [q * (1 if i % 2 == 0 else MOD-1) % MOD for i, q in enumerate(Q)]
V = self.convolution(Q, Q_minus)
U = self.convolution(P, Q_minus)
if k % 2 == 0:
P = [U[i] for i in range(0, len(U), 2)]
else:
P = [U[i] for i in range(1, len(U), 2)]
Q = [V[i] for i in range(0, len(V), 2)]
k //= 2
return (P[0] * pow(Q[0],-1,MOD)) % MOD
def main():
n,m = RII()
a = RIL()
a.append(1)
n += 1
a.sort()
MOD = 998244353
Q = [0]*(10010)
Q[0] = 1
for x in a:
for i in range(10009,-1,-1):
if Q[i]>0:
Q[i+x] = (Q[i+x]-Q[i])%MOD
P = [0]*(10010)
P[0] = 1
#print(P,Q)
ntt = NTT()
ans = ntt.bostan_mori(P,Q,m)
print(ans)
if __name__ == '__main__':
main()
提出情報
| 提出日時 |
|
| 問題 |
G - Linear Inequation |
| ユーザ |
x3x3 |
| 言語 |
Python (PyPy 3.11-v7.3.20) |
| 得点 |
600 |
| コード長 |
7253 Byte |
| 結果 |
AC |
| 実行時間 |
1728 ms |
| メモリ |
230292 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
600 / 600 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt |
| All |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 00_sample_00.txt |
AC |
222 ms |
120016 KiB |
| 00_sample_01.txt |
AC |
326 ms |
127780 KiB |
| 00_sample_02.txt |
AC |
927 ms |
170728 KiB |
| 00_sample_03.txt |
AC |
1728 ms |
230172 KiB |
| 01_random_04.txt |
AC |
1696 ms |
227568 KiB |
| 01_random_05.txt |
AC |
1715 ms |
230124 KiB |
| 01_random_06.txt |
AC |
1647 ms |
223572 KiB |
| 01_random_07.txt |
AC |
1633 ms |
223868 KiB |
| 01_random_08.txt |
AC |
1616 ms |
222132 KiB |
| 01_random_09.txt |
AC |
1720 ms |
230224 KiB |
| 01_random_10.txt |
AC |
1598 ms |
219956 KiB |
| 01_random_11.txt |
AC |
1650 ms |
223772 KiB |
| 01_random_12.txt |
AC |
1690 ms |
225700 KiB |
| 01_random_13.txt |
AC |
1726 ms |
230072 KiB |
| 01_random_14.txt |
AC |
1707 ms |
225844 KiB |
| 01_random_15.txt |
AC |
1690 ms |
227912 KiB |
| 01_random_16.txt |
AC |
1676 ms |
227888 KiB |
| 01_random_17.txt |
AC |
1657 ms |
225688 KiB |
| 01_random_18.txt |
AC |
1695 ms |
229980 KiB |
| 01_random_19.txt |
AC |
1683 ms |
227864 KiB |
| 01_random_20.txt |
AC |
1716 ms |
230236 KiB |
| 01_random_21.txt |
AC |
1703 ms |
229964 KiB |
| 01_random_22.txt |
AC |
1678 ms |
227928 KiB |
| 01_random_23.txt |
AC |
1703 ms |
230168 KiB |
| 01_random_24.txt |
AC |
1710 ms |
230172 KiB |
| 01_random_25.txt |
AC |
1704 ms |
230004 KiB |
| 01_random_26.txt |
AC |
1722 ms |
230208 KiB |
| 01_random_27.txt |
AC |
1664 ms |
225840 KiB |
| 01_random_28.txt |
AC |
1721 ms |
229984 KiB |
| 01_random_29.txt |
AC |
1702 ms |
227848 KiB |
| 01_random_30.txt |
AC |
1721 ms |
230160 KiB |
| 01_random_31.txt |
AC |
1691 ms |
230172 KiB |
| 01_random_32.txt |
AC |
1677 ms |
227896 KiB |
| 01_random_33.txt |
AC |
1709 ms |
230292 KiB |
| 01_random_34.txt |
AC |
1702 ms |
230224 KiB |