Convolution

畳み込みを行います。数列 $a_0, a_1, \cdots, a_{N - 1}$ と数列 $b_0, b_1, \cdots, b_{M - 1}$ から、長さ $N + M - 1$ の数列

$$c_i = \sum_{j = 0}^i a_j b_{i - j}$$

を計算します。

convolution

(1) convolution[T:SomeInteger](a:seq[T], b:seq[T], m:static[int]):seq[T]
💻(2) convolution[T:StaticModInt](a:seq[StaticModInt], b:seq[StaticModInt]):seq[StaticModInt]

畳み込みを $\bmod m$ で計算します。$a, b$ の少なくとも一方が空配列の場合は空配列を返します。

制約

計算量

$n = |a| + |b|$ として

convolution_ll

convolution_ll(a:seq[int], b:seq[int]):seq[int]

畳み込みを計算します。$a, b$ の少なくとも一方が空配列の場合は空配列を返します。

制約

計算量

$n = |a| + |b|$ として

使用例

AC code of https://atcoder.jp/contests/practice2/tasks/practice2_f

include atcoder/header import atcoder/convolution import atcoder/modint let n, m = nextInt() a = newSeqWith(n, nextInt()) b = newSeqWith(m, nextInt()) let c = convolution[998244353, int](a, b) # or: c = convolution<998244353>(a, b) echo c.join(" ")

AC code of https://atcoder.jp/contests/practice2/tasks/practice2_f

include atcoder/header import atcoder/modint import atcoder/convolution type mint = modint998244353 let n, m = nextInt() a = newSeqWith(n, mint(nextInt())) b = newSeqWith(m, mint(nextInt())) c = convolution(a, b) echo c.join(" ")