暴力 ln,Exp 和求逆的记录
zhiyangfan · · 个人记录
暴力 ln,Exp 和求逆的记录
很短一篇博客,只是为了记录我经常忘的 两个式子 现在是三个了。
设
这样的话,如果设:
这样的话,它们的系数满足:
这样显然我们就得到了:
注意到第二个式子是正确的,是因为
多项式
#include <cstdio>
const int N = 1e5 + 10, mod = 998244353; int f[N], g[N];
inline int ksm(int a, int b)
{
int ret = 1;
while (b) { if (b & 1) ret = 1ll * ret * a % mod; a = 1ll * a * a % mod; b >>= 1; }
return ret;
}
int main()
{
int n; scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &g[i]);
f[0] = 1; printf("%d ", f[0]);
for (int i = 1; i < n; ++i)
{
for (int j = 1; j <= i; ++j) (f[i] += 1ll * f[i - j] * j % mod * g[j] % mod) %= mod;
f[i] = 1ll * f[i] * ksm(i, mod - 2) % mod; printf("%d ", f[i]);
}
puts(""); return 0;
}
多项式
#include <cstdio>
const int N = 1e5 + 10, mod = 998244353; int f[N], g[N];
inline int ksm(int a, int b)
{
int ret = 1;
while (b) { if (b & 1) ret = 1ll * ret * a % mod; a = 1ll * a * a % mod; b >>= 1; }
return ret;
}
int main()
{
int n; scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &f[i]);
g[0] = 0; printf("%d ", g[0]);
for (int i = 1; i < n; ++i)
{
for (int j = 1; j < i; ++j) (g[i] += 1ll * f[i - j] * j % mod * g[j] % mod) %= mod;
g[i] = 1ll * g[i] * ksm(i, mod - 2) % mod; g[i] = (0ll + f[i] - g[i] + mod) % mod;
printf("%d ", g[i]);
}
puts(""); return 0;
}
求逆比上面俩简单一点。因为有