题目大意:给出$n-1$次多项式$A(x)$,求一个 $\bmod{x^n}$下的多项式$B(x)$,满足$B(x) \equiv e^{A(x)}$。

题解:(by Weng_weijie)

泰勒展开:
$$
f(x)=f(x_0)+\dfrac{f'(x_0)(x-x_0)}{1!}+\dfrac{f''(x_0)(x-x_0)^2}{2!}+\dots
$$

牛顿迭代:

$$
解关于 F(x) 的方程使得 G(F(x))\equiv 0\pmod{x^n} \\
假设 G(F_0(x)) \equiv 0 \pmod{x^{\big\lceil\dfrac{n}{2}\big\rceil}} \\
对 G(F(x)) 在 F_0(x) 处泰勒展开得 \\
G(F(x)) \equiv G(F_0(x)) + \dfrac{G'(F_0(x))(F(x)-F_0(x))}{1!}+\dots \pmod{x^n} \\
又F(x)-F_0(x)\equiv 0\pmod{x^{\big\lceil\dfrac{n}{2}\big\rceil}} \\
(F(x)-F_0(x))^2\equiv 0\pmod{x^n} \\
\begin{align*}
\therefore G(F(x))&\equiv G(F_0(x)) + G'(F_0(x))(F(x)-F_0(x))\\
&\equiv 0\pmod{x^n} \\
\end{align*}\\
得到 F(x)=F_0(x)-\dfrac{G(F_0(x))}{G'(F_0(x))}
$$

多项式指数函数:

$$
设F(x)=e^{A(x)}, \ln F(x)=A(x), G(F(x))=\ln F(x)-A(x) \\
于是就是解 G(F(x))=0,代入牛顿迭代公式得:\\
F(x)=F_0(x)(1-\ln F_0(x)+A(x))
$$
卡点:

C++ Code:

#include <cstdio>
#include <algorithm>
#define maxn 1 << 18 | 3
const int mod = 998244353, G = 3;
inline int pw(int base, int p) {
int ans = 1;
for (; p; p >>= 1, base = 1ll * base * base % mod) if (p & 1) ans = 1ll * ans * base % mod;
return ans;
}
inline int Inv(int x) {return pw(x, mod - 2);}
namespace Poly {
int lim, ilim, s, rev[maxn];
int Wn[maxn + 1], inv[maxn], __invnum;
#define i __invnum
inline int getinv(int n) {
while (i < n) {i++; inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;}
return inv[n];
}
inline void INIT() {inv[i = 1] = 1;}
#undef i
inline void init(int n) {
lim = 1, s = -1; while (lim < n) lim <<= 1, s++; ilim = getinv(lim);
for (int i = 0; i < lim; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
int t = pw(G, (mod - 1) / lim);
Wn[0] = 1; for (int i = 1; i <= lim; i++) Wn[i] = 1ll * Wn[i - 1] * t % mod;
} inline void up(int &a, int b) {if ((a += b) >= mod) a -= mod;}
inline void NTT(int *A, int op) {
for (int i = 0; i < lim; i++) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
for (int mid = 1; mid < lim; mid <<= 1) {
int t = lim / mid >> 1;
for (int i = 0; i < lim; i += mid << 1) {
for (int j = 0; j < mid; j++) {
int W = op ? Wn[t * j] : Wn[lim - t * j];
int X = A[i + j], Y = 1ll * A[i + j + mid] * W % mod;
up(A[i + j], Y), up(A[i + j + mid] = X, mod - Y);
}
}
}
if (!op) for (int i = 0; i < lim; i++) A[i] = 1ll * A[i] * ilim % mod;
}
inline void DER(int *A, int *B, int n) {
B[n - 1] = 0; for (int i = 1; i < n; i++) B[i - 1] = 1ll * A[i] * i % mod;
}
inline void INT(int *A, int *B, int n) {
B[0] = 0; for (int i = 1; i < n; i++) B[i] = 1ll * A[i - 1] * inv[i] % mod;
}
int C[maxn];
void INV(int *A, int *B, int n) {
if (n == 1) {B[0] = Inv(A[0]); return ;}
INV(A, B, n + 1 >> 1);
init(n << 1);
for (int i = 0; i < n; i++) C[i] = A[i];
for (int i = n; i < lim; i++) C[i] = 0;
NTT(B, 1), NTT(C, 1);
for (int i = 0; i < lim; i++) B[i] = (2 + mod - 1ll * B[i] * C[i] % mod) * B[i] % mod;
NTT(B, 0);
for (int i = n; i < lim; i++) B[i] = 0;
}
int D[maxn];
inline void LN(int *A, int *B, int n) {
DER(A, D, n), INV(A, B, n);
init(n << 1);
NTT(B, 1), NTT(D, 1);
for (int i = 0; i < lim; i++) D[i] = 1ll * D[i] * B[i] % mod;
NTT(D, 0);
INT(D, B, n);
for (int i = n; i < lim; i++) B[i] = 0;
}
int E[maxn], F[maxn];
void EXP(int *A, int *B, int n) {
if (n == 1) {B[0] = 1; return ;}
EXP(A, B, n + 1 >> 1);
for (int i = 0; i < n << 1; i++) E[i] = F[i] = 0;
LN(B, E, n);
for (int i = 0; i < n; i++) F[i] = A[i];
NTT(B, 1), NTT(E, 1), NTT(F, 1);
for (int i = 0; i < lim; i++) B[i] = (1ll + mod - E[i] + F[i]) * B[i] % mod;
NTT(B, 0);
for (int i = n; i < lim; i++) B[i] = 0;
}
}
int a[maxn], b[maxn], n;
int main() {
scanf("%d", &n);
Poly::INIT();
for (int i = 0; i < n; i++) scanf("%d", a + i);
Poly::EXP(a, b, n);
for (int i = 0; i < n; i++) printf("%d ", b[i]); puts("");
return 0;
}

  

[洛谷P4726]【模板】多项式指数函数的更多相关文章

  1. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  2. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  3. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  4. 洛谷.4238.[模板]多项式求逆(NTT)

    题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...

  5. 洛谷 P4512 [模板] 多项式除法

    题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...

  6. 洛谷 P4238 [模板] 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆

    概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...

  9. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

随机推荐

  1. java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数

    package com.swift.jinji; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im ...

  2. Session和cookic

    session是无状态的方式,服务器存储机制,当用户第一次请求服务器,服务器会给客户分配一个标识id,客户端再次访问服务器,根据session id 去访问服务器数据库,返回信息,同时session ...

  3. 【学时总结】 ◆学时·IV◆ 数位DP

    [学时·IV] 数位DP ■基本策略■ 说白了就是超时和不超时的区别 :) 有一些特别的题与数位有关,但是用一般的枚举算法会超时.这时候就有人提出了--我们可以用动态规划!通过数字前一位和后一位之间的 ...

  4. UVA_1434_YAPTCHA

    The math department has been having problems lately. Due to immense amount of unsolicited automated ...

  5. mac安装mysql及workbench

    安装mysql 登录MySQL网站 打开网站Download MySQL Community Server,选择下方的dmg文件下载 点击download,此处为8.0.11版本 然后选择no tha ...

  6. MySQL中事物的详解

    1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败.事物有如下四个特性,ACID简称“酸性”. 1)原子性:工作单元中所有的操作要么 ...

  7. centos下LVM配置与管理

    centos下LVM配置与管理 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层, ...

  8. 搭建Maven私有仓库

    Nexus官网下载:Nexus Repository Manager OSS :https://www.sonatype.com/download-oss-sonatype 1.解压 $ tar -z ...

  9. js中break跳出多层循环

    // 当执行多重循环的时候break的情况 outer: for(var i=0;i<10;i++){ inter: for(var j=0;j<10;j++){ if(i>5){ ...

  10. [Uva11178]Morley's Theorem(计算几何)

    Description 题目链接 Solution 计算几何入门题 只要求出三角形DEF的一个点就能推出其他两个点 把一条边往内旋转a/3度得到一条射线,再做一条交点就是了 Code #include ...