题目
分析
简单的变性之后可以变成卷积的形式,然后上ntt
ntt教材
代码
#include <bits/stdc++.h>
typedef long long LL;
const int MAXN = 300005;
const int MOD = 998244353;
int n,jc[MAXN],ny[MAXN],a[MAXN],b[MAXN],rev[MAXN],N,lg;
int ksm(int x,int y)
{
int ans = 1;
while (y)
{
if (y & 1)
ans = (LL)ans * x % MOD;
x = (LL)x * x % MOD;
y >>= 1;
}
return ans;
}
void NTT(int *a,int f)
{
for (int i = 0; i < N; i++)
if (i < rev[i])
std::swap(a[i],a[rev[i]]);
for (int i = 1; i < N; i <<= 1)
{
int wn = ksm(3, f == 1 ? (MOD - 1) / i / 2 : MOD - 1 - (MOD - 1) / i / 2);
for (int j = 0; j < N; j += (i << 1))
{
int w = 1;
for (int k = 0; k < i; k++)
{
int u = a[j + k], v = (LL)w * a[j + k + i] % MOD;
a[j + k] = (u + v) % MOD;
a[j + k + i] = (u - v) % MOD;
w = (LL)w * wn % MOD;
}
}
}
int ny = ksm(N, MOD - 2);
if (f == -1)
for (int i = 0; i < N; i++)
a[i] = (LL)a[i] * ny % MOD;
}
int main()
{
scanf("%d",&n);
jc[0] = ny[0] = 1;
for (int i = 1; i <= n; i++)
{
jc[i] = (LL)jc[i - 1] * i % MOD;
ny[i] = ksm(jc[i], MOD - 2);
}
for (int i = 0; i <= n; i++)
{
if (i % 2 == 0)
a[i] = ny[i];
else a[i] = -ny[i];
b[i] = (LL)(ksm(i, n + 1) - 1) * ksm(i - 1, MOD - 2) % MOD * ny[i] % MOD;
}
b[1] = n + 1;
for (N = 1; N <= n * 2; N *= 2, lg++);
for (int i = 0; i < N; i++)
rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg - 1));
NTT(a,1);
NTT(b,1);
for (int i = 0; i < N; i++)
a[i] = (LL)a[i] * b[i] % MOD;
NTT(a,-1);
int ans = 0, now = 1;
for (int i = 0; i <= n; i++)
{
ans = (ans + (LL)now * jc[i] % MOD * a[i] % MOD) % MOD;
now = now * 2 % MOD;
}
printf("%d",(ans + MOD) % MOD);
}