$G(x)=ln(A(x))$
$G'(x)=ln'(A(x))A'(x)=\frac{A'(x)}{A(x)}$    
由于求导和积分是互逆的,所以对 $G$ 求积分,即
$G(x)=\int\frac{A'(x)}{A(x)}$
用求导 + 求逆 + 积分做一下即可
这里给出求导/积分的公式:
$\int F(x)=\sum_{i=0}^{n}\frac{a_{i}}{i+1}x^{i+1}$
$d(F(x))=\sum_{i=1}^{n}i\times a_{i}x^{i-1}$         
  1. #include <cstdio>
  2. #include <string>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <vector>
  6. #define setIO(s) freopen(s".in","r",stdin)
  7. typedef long long ll;
  8. const int maxn=2100005;
  9. const ll mod=998244353;
  10. using namespace std;
  11. inline ll qpow(ll base,ll k) {
  12. ll tmp=1;
  13. for(;k;k>>=1,base=base*base%mod)if(k&1) tmp=tmp*base%mod;
  14. return tmp;
  15. }
  16. inline ll inv(ll a) { return qpow(a, mod-2); }
  17. inline void NTT(ll *a,int len,int flag) {
  18. for(int i=0,k=0;i<len;++i) {
  19. if(i>k) swap(a[i],a[k]);
  20. for(int j=len>>1;(k^=j)<j;j>>=1);
  21. }
  22. for(int mid=1;mid<len;mid<<=1) {
  23. ll wn=qpow(3, (mod-1)/(mid<<1)),x,y;
  24. if(flag==-1) wn=qpow(wn,mod-2);
  25. for(int i=0;i<len;i+=(mid<<1)) {
  26. ll w=1;
  27. for(int j=0;j<mid;++j) {
  28. x=a[i+j],y=w*a[i+j+mid]%mod;
  29. a[i+j]=(x+y)%mod, a[i+j+mid]=(x-y+mod)%mod;
  30. w=w*wn%mod;
  31. }
  32. }
  33. }
  34. if(flag==-1) {
  35. int re=qpow(len,mod-2);
  36. for(int i=0;i<len;++i) a[i]=a[i]*re%mod;
  37. }
  38. }
  39. ll A[maxn],B[maxn];
  40. struct poly {
  41. vector<ll>a;
  42. int len;
  43. poly(){}
  44. inline void clear() { len=0; a.clear(); }
  45. inline void rev() {reverse(a.begin(), a.end()); }
  46. inline void push(int x) { a.push_back(x),++len; }
  47. inline void resize(int x) { len=x; a.resize(x); }
  48. void getinv(poly &b,int n) {
  49. if(n==1) { b.clear(); b.push(inv(a[0])); return; }
  50. getinv(b,n>>1);
  51. int t=n<<1,lim=min(len,n);
  52. for(int i=0;i<lim;++i) A[i]=a[i];
  53. for(int i=lim;i<t;++i) A[i]=0;
  54. for(int i=0;i<b.len;++i) B[i]=b.a[i];
  55. for(int i=b.len;i<t;++i) B[i]=0;
  56. NTT(A,t,1),NTT(B,t,1);
  57. for(int i=0;i<t;++i) A[i]=(2-A[i]*B[i]%mod+mod)*B[i]%mod;
  58. NTT(A,t,-1);
  59. b.clear();
  60. for(int i=0;i<n;++i) b.push(A[i]);
  61. }
  62. poly Inv() {
  63. int n=1;
  64. while(n<=len)n<<=1;
  65. poly b;
  66. b.clear(), getinv(b,n);
  67. return b;
  68. }
  69. poly dao() {
  70. poly c;
  71. c.resize(len);
  72. for(int i=1;i<=len;++i) c.a[i-1]=a[i]*i%mod;
  73. return c;
  74. }
  75. poly jifen() {
  76. poly c;
  77. c.resize(len+1);
  78. for(int i=1;i<=len;++i) c.a[i]=a[i-1]*qpow(i,mod-2)%mod;
  79. c.a[0]=0;
  80. return c;
  81. }
  82. poly Ln() {
  83. poly c=dao()*Inv();
  84. return c.jifen();
  85. }
  86. poly operator * (const poly &b) const {
  87. int n=1;
  88. while(n<=len+b.len) n<<=1;
  89. for(int i=0;i<len;++i) A[i]=a[i];
  90. for(int i=len;i<n;++i) A[i]=0;
  91. for(int i=0;i<b.len;++i) B[i]=b.a[i];
  92. for(int i=b.len;i<n;++i) B[i]=0;
  93. NTT(A,n,1), NTT(B,n,1);
  94. for(int i=0;i<n;++i) A[i]=A[i]*B[i]%mod;
  95. NTT(A,n,-1);
  96. poly c;
  97. c.clear();
  98. for(int i=0;i<len+b.len-1;++i) c.push(A[i]);
  99. return c;
  100. }
  101. poly operator + (const poly &b) const {
  102. poly c;
  103. c.clear();
  104. for(int i=0;i<len;++i) c.push(a[i]);
  105. for(int i=0;i<b.len;++i) {
  106. if(i<len) c.a[i]=(c.a[i]+b.a[i])%mod;
  107. else c.push(b.a[i]);
  108. }
  109. return c;
  110. }
  111. poly operator - (const poly &b) const {
  112. poly c;
  113. c.clear();
  114. for(int i=0;i<len;++i) c.push(a[i]);
  115. for(int i=0;i<b.len;++i) {
  116. if(i<len) c.a[i]=(c.a[i]-b.a[i]+mod)%mod;
  117. else c.push((mod-b.a[i])%mod);
  118. }
  119. return c;
  120. }
  121. friend poly operator / (poly f,poly g) {
  122. poly Q;
  123. int l=f.len-g.len+1;
  124. f.rev(), g.rev(), g.resize(l), f.resize(l);
  125. g=g.Inv(), Q=f*g, Q.resize(l),Q.rev();
  126. return Q;
  127. }
  128. friend poly operator % (poly f,poly g) {
  129. poly u=f-(f/g)*g;
  130. u.resize(g.len-1);
  131. return u;
  132. }
  133. }po[4];
  134. inline void inv() {
  135. int n,x;
  136. scanf("%d",&n), po[0].clear();
  137. for(int i=0;i<n;++i) scanf("%d",&x), po[0].push(x);
  138. po[1]=po[0].Inv();
  139. for(int i=0;i<po[1].len;++i) printf("%lld ",po[1].a[i]);
  140. }
  141. inline void mult() {
  142. int n,m,x;
  143. scanf("%d%d",&n,&m);
  144. for(int i=0;i<=n;++i) scanf("%d",&x), po[0].push(x);
  145. for(int i=0;i<=m;++i) scanf("%d",&x), po[1].push(x);
  146. po[1]=po[0]*po[1];
  147. for(int i=0;i<po[1].len;++i) printf("%lld ",po[1].a[i]);
  148. }
  149. inline void divide() {
  150. int n,m,x;
  151. scanf("%d%d",&n,&m);
  152. for(int i=0;i<=n;++i) scanf("%d",&x), po[0].push(x);
  153. for(int i=0;i<=m;++i) scanf("%d",&x), po[1].push(x);
  154. po[2]=po[0]/po[1];
  155. for(int i=0;i<po[2].len;++i) printf("%lld ",po[2].a[i]);
  156. printf("\n");
  157. po[2]=po[0]%po[1];
  158. for(int i=0;i<po[2].len;++i) printf("%lld ",po[2].a[i]);
  159. }
  160. inline void Ln() {
  161. int n,x;
  162. scanf("%d",&n);
  163. for(int i=0;i<n;++i) scanf("%d",&x), po[0].push(x);
  164. po[0]=po[0].Ln();
  165. for(int i=0;i<n;++i) printf("%lld ",po[0].a[i]);
  166. }
  167. int main() {
  168. // setIO("input");
  169. Ln();
  170. return 0;
  171. }

  

luogu 4725 【模板】多项式对数函数(多项式 ln)的更多相关文章

  1. 洛谷P4725 【模板】多项式对数函数(多项式ln)

    题意 题目链接 Sol 这个不用背XD 前置知识: \(f(x) = ln(x), f'(x) = \frac{1}{x}\) \(f(g(x)) = f'(g(x)) g'(x)\) 我们要求的是\ ...

  2. luogu P4725 多项式对数函数(多项式 ln)

    LINK:多项式对数函数 多项式 ln 如题 是一个模板题.刚学会导数 几个知识点 \([f(x)\cdot g(x)]'=f(x)'g(x)+f(x)g(x)',f(g(x))'=f'(g(x))g ...

  3. 【Cogs2187】帕秋莉的超级多项式(多项式运算)

    [Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...

  4. 多项式总结&多项式板子

    多项式总结&多项式板子 三角/反三角是不可能放的(也不可能真香的 多项式乘法(DFT,FFT,NTT,MTT) 背板子 前置知识:泰勒展开 如果\(f(x)\)在\(x_0\)处存在\(n\) ...

  5. [luogu P3384] [模板]树链剖分

    [luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...

  6. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

  7. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

  8. Luogu 4725 【模板】多项式对数函数

    继续补全模板. 要求 $$g(x) = ln f(x)$$ 两边求导, $$g'(x) = \frac{f'(x)}{f(x)}$$ 然后左转去把多项式求导和多项式求逆的模板复制过来,就可以计算出$g ...

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

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

随机推荐

  1. C#各种委托介绍

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 一.委托的声明 Delegate Delegate 我们常用到的一种声明 Delegate 至少 ...

  2. 9.Jmeter 多个threadgroup 中的配置元件会一次性进行初始化

    例如3个threadGroup,每一个threadGroup中都会定义了 一些配置原件,例如 用户定义变量,  jdbc 链接配置等.  当执行testplan(测试计划)时, 这些配置元件会一起初始 ...

  3. idea 如何运行maven项目

    1:run→Edit configurations 2:配置tomcat,左边如果没有tomcat server的话,点击 “+”,选择tomcat  server→local,在右边server选项 ...

  4. 小程序图片预览 wx.previewImage

      list: [ 'http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0.jpg', 'http://i ...

  5. Elasticsearch-索引新数据(创建索引、添加数据)

    ES-索引新数据 0.通过mapping映射新建索引 CURL -XPOST 'localhost:9200/test/index?pretty' -d '{ "mappings" ...

  6. etcd api常用操作

    如果需要使用v2 version api,启动etcd时候需要加入“ETCD_ENABLE_V2=true”参数,否则会报错“404 page not found” 获取etcd信息 版本信息 # c ...

  7. Http服务器搭建(CentOS 7)

    注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...

  8. HDU-4507-吉哥系列故事-恨7不成妻

    题目描述 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...

  9. cs244a-Introduction to Computer Networking-Unit1

    Unit 1 学习目标: how an application use the Internet The structure of the Internet:The 4 layer model The ...

  10. [工具]Hydra-爆破

    语法 hydra [[[-l LOGIN | -L FILE]                      [-p PASS | -P FILE]] |                      [-C ...