題意
給出和一個次多項式在處的點值,計算
分析
若我們已經把轉成了下降冪多項式的形式
那麼
問題轉化爲如何將點值轉成下降冪。考慮點值的EGF
因此只要把點值的EGF乘上,就可以得到下降冪的OGF了。
時間複雜度。
代碼
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100005;
const int MOD = 998244353;
int n, m, x, jc[N], ny[N], rev[N], L, a[N], b[N];
void pre()
{
jc[0] = jc[1] = ny[0] = ny[1] = 1;
for (int i = 2; i <= m; i++) jc[i] = (LL)jc[i - 1] * i % MOD, ny[i] = (LL)(MOD - MOD / i) * ny[MOD % i] % MOD;
for (int i = 2; i <= m; i++) ny[i] = (LL)ny[i - 1] * ny[i] % MOD;
int lg = 0;
for (L = 1; L <= m * 2; L <<= 1, lg++);
for (int i = 0; i < L; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg - 1));
}
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 < L; i++) if (i < rev[i]) swap(a[i], a[rev[i]]);
for (int i = 1; i < L; i <<= 1)
{
int wn = ksm(3, f == 1 ? (MOD - 1) / i / 2 : MOD - 1 - (MOD - 1) / i / 2);
for (int j = 0; j < L; j += (i << 1))
{
int w = 1;
for (int k = 0; k < i; k++)
{
int u = a[j + k], v = (LL)a[j + k + i] * w % MOD;
a[j + k] = (u + v) % MOD; a[j + k + i] = (u + MOD - v) % MOD;
w = (LL)w * wn % MOD;
}
}
}
if (f == -1) for (int i = 0, inv = ksm(L, MOD - 2); i < L; i++) a[i] = (LL)a[i] * inv % MOD;
}
int main()
{
scanf("%d%d%d", &n, &m, &x);
for (int i = 0; i <= m; i++) scanf("%d", &a[i]);
pre();
for (int i = 0; i <= m; i++) a[i] = (LL)a[i] * ny[i] % MOD, b[i] = (i & 1) ? MOD - ny[i] : ny[i];
NTT(a, 1); NTT(b, 1);
for (int i = 0; i < L; i++) a[i] = (LL)a[i] * b[i] % MOD;
NTT(a, -1);
int ans = 0, w = 1;
for (int i = 0; i <= m; i++)
{
(ans += (LL)a[i] * w % MOD) %= MOD;
w = (LL)w * (n - i) % MOD * x % MOD;
}
printf("%d\n", ans);
return 0;
}