$f(x) := \sum_{i=0}^{|a| - 1} a[i] x^i \bmod{MOD}$, $g(x) := \sum_{i=0}^{|b| - 1} b[i] x^i \bmod{MOD}$ として、
積 $f(x)g(x) \equiv \sum_{i=0}^{|a| + |b| - 2} c[i] x^i \pmod{MOD}$ となるような大きさ $|a| + |b| - 1$ の列 $c[i] \bmod{MOD}$ 返します。
$a, b$ いずれかが空である場合は、空の列を返します。
#include <bits/stdc++.h>
#include "Convolution/NumberTheoreticTransform_AnyMod.hpp"
using namespace std;
int main() {
vector<int> a({0, 1, 2, 3}), b({2, 3, 4});
auto c = NumberTheoreticTransform_AnyMod<14>::multiply(a, b);
cout << "size = " << c.size() << endl; // 6
for (int i = 0; i < c.size(); ++i) cout << c[i] << " "; cout << endl; // 0 2 7 2 3 12
// 2 3 4
// 4 6 8
// 6 9 12
// ==============
// 0 2 7 16 17 12
// 0 2 7 2 3 12
vector<int> a2({4}), b2({3, 2});
auto c2 = NumberTheoreticTransform_AnyMod<7>::multiply(a2, b2);
cout << "size = " << c2.size() << endl; // 2
for (int i = 0; i < c2.size(); ++i) cout << c2[i] << " "; cout << endl; // 5 1
// 12
// 8
// ==============
// 12 8
// 5 1
vector<int> a3, b3({1, 2, 3});
auto c3 = NumberTheoreticTransform_AnyMod<100>::multiply(a3, b3);
cout << "size = " << c3.size() << endl; // 0
}