luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)

手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/suncongbo/article/details/84487306

题目链接: https://www.luogu.org/problemnew/show/P4725

题目大意: 给定一个\(n\)次多项式\(A(x)\), 求一个\(n\)次多项式\(B(x)\)满足\(B(x)\equiv \ln A(x) (\mod x^n)\)

题解: 神数学模板题……
数学真奇妙!
前驱知识
导数、积分相关
幂函数的求导
\(f(x)=x^n, f'(x)=nx^{n-1}\)
和的导数等于导数的和
\((f+g)'(x)=f'(x)+g'(x)\)
一般多项式的求导
\(f(x)=\sum^{n-1}_{i=0} a_ix^i, f'(x)=\sum^{n-2}_{i=0} (i+1)a_{i+1}x^i\)
对数函数\(\ln\)的求导
\(f(x)=\ln(x), f'(x)=\frac{1}{x}\)
复合函数求导——链式法则
\(f(g(x))'=f'(g(x))g'(x)\)
求导的逆运算——积分

本题解法
\(g(x)\equiv \ln f(x) (\mod x^n)\)
两边同时求导可得
\(g'(x)\equiv \frac{f'(x)}{f(x)} (\mod x^n)\)
结束!
多项式求逆算\(\frac{1}{f(x)}\),再和\(f'(x)\)相乘即可得到\(g'(x)\)。
(多项式求逆见蒟蒻一篇博客 https://blog.csdn.net/suncongbo/article/details/84485718)
\(g'(x)\)积个分得到\(g(x)\). 常数项,直接为\(0\).
时间复杂度\(O(n\log n)\)
常数,我写的大概\(9\)倍吧,求逆是\(6\)倍,再做个乘法就是\(3\)倍。
UPD: 仔细想了一下我这个常数好像是\(18\)倍(见我多项式求逆那篇博客)

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define llong long long
#define ldouble long double
#define uint unsigned int
#define ullong unsigned long long
#define udouble unsigned double
#define uldouble unsigned long double
#define modinc(x) {if(x>=P) x-=P;}
#define pii pair<int,int>
#define piii pair<pair<int,int>,int>
#define piiii pair<pair<int,int>,pair<int,int> >
#define pli pair<llong,int>
#define pll pair<llong,llong>
#define Memset(a,x) {memset(a,x,sizeof(a));}
using namespace std;const int N = 1<<19;
const int P = 998244353;
const int LGN = 19;
const int G = 3;
llong a[N+3];
llong b[N+3];
llong tmp1[N+3],tmp2[N+3],tmp3[N+3],tmp4[N+3]; //inv
llong tmp7[N+3],tmp8[N+3],tmp9[N+3],tmp10[N+3]; //ln
int id[N+2];
int n;void initid(int _len)
{id[0] = 0;for(int i=1; i<(1<<_len); i++) id[i] = (id[i>>1]>>1)|((i&1)<<(_len-1));
}llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)){y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);}void ntt(int dgr,int coe,llong poly[],llong ret[])
{int len = 0; for(int i=0; i<=LGN; i++) if((1<<i)==dgr) {len = i; break;}initid(len); for(int i=0; i<dgr; i++) ret[i] = 0ll;for(int i=0; i<dgr; i++) ret[i] = poly[i];for(int i=0; i<dgr; i++) if(i<id[i]) swap(ret[i],ret[id[i]]);for(int i=1; i<=(dgr>>1); i<<=1){llong tmp = quickpow(G,(P-1)/(i<<1));if(coe==-1) tmp = mulinv(tmp);for(int j=0; j<dgr; j+=(i<<1)){llong expn = 1ll;for(int k=0; k<i; k++){llong x = ret[j+k],y = (expn*ret[j+i+k])%P;ret[j+k] = x+y; modinc(ret[j+k]);ret[j+i+k] = x-y+P; modinc(ret[j+i+k]);expn = (expn*tmp)%P;}}}if(coe==-1){llong tmp = mulinv(dgr);for(int i=0; i<dgr; i++) ret[i] = ret[i]*tmp%P;}
}void polyinv(int dgr,llong poly[],llong ret[])
{for(int i=0; i<dgr; i++) ret[i] = 0ll;ret[0] = mulinv(poly[0]);for(int i=1; i<=(dgr>>1); i<<=1){for(int j=0; j<(i<<2); j++) tmp1[j] = j<i ? ret[j] : 0ll;for(int j=0; j<(i<<2); j++) tmp2[j] = j<(i<<1) ? poly[j] : 0ll;ntt((i<<2),1,tmp1,tmp3); ntt((i<<2),1,tmp2,tmp4);for(int j=0; j<(i<<2); j++) tmp3[j] = tmp3[j]*tmp3[j]%P*tmp4[j]%P;ntt((i<<2),-1,tmp3,tmp4);for(int j=0; j<(i<<1); j++) ret[j] = (tmp1[j]+tmp1[j]-tmp4[j]+P)%P;}for(int i=dgr; i<(dgr<<1); i++) ret[i] = 0ll;
}void polyder(int dgr,llong poly[],llong ret[])
{for(int i=0; i<dgr-1; i++) ret[i] = poly[i+1]*(i+1)%P;
}void polyint(int dgr,llong poly[],llong ret[])
{for(int i=1; i<=dgr; i++) ret[i] = poly[i-1]*mulinv(i)%P;
}void polyln(int dgr,llong poly[],llong ret[])
{polyder(dgr,poly,tmp7);polyinv(dgr,poly,tmp8);ntt((dgr<<1),1,tmp8,tmp9); ntt((dgr<<1),1,tmp7,tmp10);for(int i=0; i<(dgr<<1); i++) tmp9[i] = tmp9[i]*tmp10[i]%P;ntt((dgr<<1),-1,tmp9,tmp10);polyint(dgr,tmp10,ret);
}int main()
{scanf("%d",&n); int dgr = 1; while(dgr<=n) dgr<<=1;for(int i=0; i<n; i++) scanf("%lld",&a[i]);polyln(dgr,a,b);for(int i=0; i<n; i++) printf("%lld ",b[i]);return 0;
}

发表于 2019-01-23 20:20 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)相关推荐

  1. luogu P4726 多项式指数函数(模板题FFT、多项式求逆、多项式对数函数)

    luogu P4726 多项式指数函数(模板题FFT.多项式求逆.多项式对数函数) 手动博客搬家: 本文发表于20181127 08:39:42, 原地址https://blog.csdn.net/s ...

  2. luogu P4512 多项式除法 (模板题、FFT、多项式求逆)

    luogu P4512 多项式除法 (模板题.FFT.多项式求逆) 手动博客搬家: 本文发表于20181206 14:42:53, 原地址https://blog.csdn.net/suncongbo ...

  3. luogu P4238 多项式求逆 (模板题、FFT)

    luogu P4238 多项式求逆 (模板题.FFT) 手动博客搬家: 本文发表于20181125 13:21:46, 原地址https://blog.csdn.net/suncongbo/artic ...

  4. 洛谷 P4725 【模板】多项式对数函数 ntt

    题目描述 给出 n−1n−1n-1 次多项式 A(x)A(x)A(x),求一个mod xnmodxnmod\ x^n 下的多项式 B(x)B(x)B(x) ,满足 B(x)≡lnA(x)B(x)≡ln ...

  5. (每日一题)P4841 [集训队作业2013]城市规划 (无向连通图计数)(普通生成函数 + 多项式求逆)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.14 生成函数 + 多项式求逆 Pr ...

  6. 多项式对数函数|指数函数(多项式)

    多项式对数函数|指数函数 这个思路就是先求导然后再积分,这样就可以得到一个式子,对于多项式对数函数,我们就可以直接求解了,然后对于多项式指数函数还需要使用分治fft. 多项式对数: #include& ...

  7. [模板]多项式全家桶小记(求逆,开根,ln,exp)

    前言 这里的全家桶目前只包括了ln,exp,sqrtln,exp,sqrtln,exp,sqrt.还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,NTTNTTNTT这种前置知识这里不多说. ...

  8. 多项式对数函数(ln)

    多项式对数函数(ln) 已知 A ( x ) A(x) A(x),求使得 B ( x ) = ln ⁡ A ( x ) B(x)=\ln A(x) B(x)=lnA(x)的 B ( x ) B(x) ...

  9. hdu 5730 Shell Necklace——多项式求逆+拆系数FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...

最新文章

  1. hbase,根据前缀匹配进行搜索并分批次获取结果
  2. wxWidgets:窗口大小概述
  3. oracle 查询创建的全文索引,CSS_oracle全文搜索创建与使用示例,说明:使用全文索引需要使用 - phpStudy...
  4. phpnow mysql字符集_使用PHPnow搭建本地PHP环境+创建MySQL数据库
  5. BZOJ3139: [Hnoi2013]比赛
  6. 面向对象思想的设计原则概述
  7. python入门先学什么-学习python需要什么基础
  8. 以下实例在用户点击按钮后对字符串进行反转操作
  9. Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Active Dataguard篇
  10. HDU6135 拓展KMP模板
  11. HTML5 新特性!
  12. 计算机超链接文档顶端,电脑在Word文档里插入目录超链接的方法
  13. BH1750 STM32 驱动程序
  14. 学籍管理系统:详细设计说明书- -
  15. SKR EOS 竞猜游戏再遭攻击,黑客共获利约4000eos
  16. Simulation?Emulation?模拟?仿真?
  17. LBS基站定位和GPS卫星定位对比
  18. 计算机中的英语六级作文万能模板,英语六级作文万能模板汇总
  19. GRE over IPSec技术原理
  20. 锂电池激光模切机 欧姆龙NX1P2-1140DT,威伦通触摸屏

热门文章

  1. Python, CPython, Pypy, Jython的简单介绍
  2. Unet项目解析(6): 图像分块、整合 / 数据对齐、网络输出转成图像
  3. ArcGis10安装
  4. NHibernate快速起步
  5. golang的GUI库,使用go-fyne设计一个代办事项APP
  6. cmake的使用-if-else的逻辑流程详解
  7. JAVA去掉指定字符
  8. 《编码的奥秘》---学习编程一年半的体会
  9. 日常生活小技巧 --惠普战66三代 重装系统
  10. linux下启动和关闭网卡命令