
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 998244353, maxn = 3e6;
ll a[maxn], b[maxn];
void fft(ll w0, ll n, ll* a)
{
for (ll i = 0, j = 0; i < n; i++) {
if (i < j)
swap(a[i], a[j]);
ll bit = n >> 1;
for (; j & bit; bit >>= 1)
j ^= bit;
j ^= bit;
}
for (ll len = 2; len <= n; len <<= 1) {
ll wlen = w0;
for (ll aux = n; aux > len; aux >>= 1) {
wlen = wlen * wlen % mod;
}
for (ll bat = 0; bat + len <= n; bat += len) {
for (ll i = bat, w = 1; i < bat + len / 2;
i++, w = w * wlen % mod) {
ll u = a[i], v = w * a[i + len / 2] % mod;
a[i] = (u + v) % mod,
a[i + len / 2]
= ((u - v) % mod + mod) % mod;
}
}
}
}
ll binpow(ll a, ll x)
{
ll ans = 1;
for (; x; x /= 2, a = a * a % mod) {
if (x & 1)
ans = ans * a % mod;
}
return ans;
}
ll inv(ll a) { return binpow(a, mod - 2); }
void findConvolution(ll a[], ll b[], ll n, ll m)
{
ll _n = 1ll << 64 - __builtin_clzll(n + m);
ll w = 15311432;
for (ll aux = 1 << 23; aux > _n; aux >>= 1)
w = w * w % mod;
fft(w, _n, a);
fft(w, _n, b);
for (ll i = 0; i < _n; i++)
a[i] = a[i] * b[i] % mod;
fft(inv(w), _n, a);
for (ll i = 0; i < _n; i++)
a[i] = a[i] * inv(_n) % mod;
for (ll i = 0; i < n + m - 1; i++)
cout << a[i] << " ";
}
int main()
{
ll N = 4, M = 5;
for (ll i = 0; i < N; i++)
a[i] = i + 1;
for (ll i = 0; i < M; i++)
b[i] = 5 + i;
findConvolution(a, b, N, M);
return 0;
}
0 comments:
Post a Comment