多项式对数函数ln⁡f(x)\ln f(x)lnf(x)

如果存在解必然有[x0]f(x)=1[ x ^ 0]f(x) = 1[x0]f(x)=1,

对ln⁡f(x)\ln f(x)lnf(x)求导,有dln⁡f(x)dx≡f′(x)f(x)(modxn)\frac{d \ln f(x)}{dx} \equiv \frac{f'(x)}{f(x)} \pmod {x ^ n}dxdlnf(x)​≡f(x)f′(x)​(modxn),

dxdxdx乘到右边,再求积分有:
∫dln⁡f(x)≡∫f′(x))f(x)dx(modxn)ln⁡f(x)≡∫f′(x)f(x)(modxn)\int d \ln f(x) \equiv \int \frac{f'(x))}{f(x)} dx \pmod {x ^ n}\\ \ln f(x) \equiv \int \frac{f'(x)}{f(x)} \pmod {x ^ n}\\ ∫dlnf(x)≡∫f(x)f′(x))​dx(modxn)lnf(x)≡∫f(x)f′(x)​(modxn)
然后只要对先对f(x)f(x)f(x)求个导,求个逆,最后求一次积分即可,整体复杂度O(nlog⁡n)O(n \log n)O(nlogn)。

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 5e6 + 10, mod = 998244353, inv2 = mod + 1 >> 1;int a[N], b[N], c[N], d[N], r[N], inv[N];int quick_pow(int a, int n) {int ans = 1;while (n) {if (n & 1) {ans = 1ll * ans * a % mod;}a = 1ll *  a * a % mod;n >>= 1;}return ans;
}void get_r(int lim) {for (int i = 0; i < lim; i++) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}void get_inv(int n) {inv[1] = 1;for (int i = 2; i < n; i++) {inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;}
}void NTT(int *f, int lim, int rev) {for (int i = 0; i < lim; i++) {if (i < r[i]) {swap(f[i], f[r[i]]);}}for (int mid = 1; mid < lim; mid <<= 1) {int wn = quick_pow(3, (mod - 1) / (mid << 1));for (int len = mid << 1, cur = 0; cur < lim; cur += len) {int w = 1;for (int k = 0; k < mid; k++, w = 1ll * w * wn % mod) {int x = f[cur + k], y = 1ll * w * f[cur + mid + k] % mod;f[cur + k] = (x + y) % mod, f[cur + mid + k] = (x - y + mod) % mod;}}}if (rev == -1) {int inv = quick_pow(lim, mod - 2);reverse(f + 1, f + lim);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * inv % mod;}}
}void polyinv(int *a, int *b, int n) {if (n == 1) {b[0] = quick_pow(a[0], mod - 2);return ;}polyinv(a, b, n + 1 >> 1);int lim = 1;while (lim < 2 * n) {lim <<= 1;}get_r(lim);for (int i = 0; i < n; i++) {c[i] = a[i];}for (int i = n; i < lim; i++) {c[i] = 0;}NTT(b, lim, 1);NTT(c, lim, 1);for (int i = 0; i < lim; i++) {int cur = (2 - 1ll * c[i] * b[i] % mod + mod) % mod;b[i] = 1ll * b[i] * cur % mod;}NTT(b, lim, -1);for (int i = n; i < lim; i++) {b[i] = 0;}
}void derivative(int *a, int *b, int n) {for (int i = 0; i < n; i++) {b[i] = 1ll * a[i + 1] * (i + 1) % mod;}
}void integrate(int *a, int n) {get_inv(n);for (int i = n - 1; i >= 1; i--) {a[i] = 1ll * a[i - 1] * inv[i] % mod;}a[0] = 0;
}void polyln(int *a, int *b, int n) {derivative(a, b, n);polyinv(a, d, n);int lim = 1;while (lim < 2 * n) {lim <<= 1;}get_r(lim);NTT(b, lim, 1);NTT(d, lim, 1);for (int i = 0; i < lim; i++) {b[i] = 1ll * b[i] * d[i] % mod;}NTT(b, lim, -1);integrate(b, n);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}polyln(a, b, n);for (int i = 0; i < n; i++) {printf("%d%c", b[i], i + 1 == n ? '\n' : ' ');}return 0;
}

多项式对数函数ln f(x)相关推荐

  1. 多项式对数函数(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) ...

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

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

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

    luogu P4725 多项式对数函数 (模板题.FFT.多项式求逆.求导和积分) 手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/s ...

  4. 【BZOJ】3456: 城市规划(多项式求ln)

    题解 在我写过分治NTT,多项式求逆之后 我又一次写了多项式求ln 我们定义一个数列的指数型生成函数为 \(\sum_{i = 0}^{n} \frac{A_{i}}{i!} x^{i}\) 然后这个 ...

  5. 多项式的ln、exp、快速幂和开根学习小记

    不妨又学习了一下多项式的求ln.exp.快速幂和开根操作. 这些操作比之前的求逆更上了一层台阶,应用同样很广. 多项式求逆等知识在我的博客里有讲:多项式的求逆.取模和多点求值学习小记 多项式ln 给出 ...

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

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

  7. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT

    题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...

  8. Luogu4725 【模板】多项式对数函数(NTT+多项式求逆)

    https://www.cnblogs.com/HocRiser/p/8207295.html 安利! #include<iostream> #include<cstdio> ...

  9. 设非零得实系数多项式 $f(x)$ (即系数都是实数得多项式)满足 $f(f(x)) = f^k(x)$,其中 $k$ 是给定得正整数。求多项式 $f(x)$

    设非零得实系数多项式 f(x)f(x)f(x) (即系数都是实数得多项式)满足 f(f(x))=fk(x)f(f(x)) = f^k(x)f(f(x))=fk(x),其中 kkk 是给定得正整数.求多 ...

最新文章

  1. 手低眼高 初学者学习Hibernate的方法
  2. 思维模型篇:四大战略分析工具
  3. 机器人 铑元素_智能机器人 三十三
  4. alxctools索引超出了数组界限_[译]V8中的数组类型
  5. android studio 便携式wlan热点 网络名称_手机移动网络共享,还可以这么玩,你知道吗?...
  6. JAVA电子书大礼包
  7. SQL Server安装下载教程
  8. Reactor 线程模型
  9. linux命令cd 什么意思,Linux命令 cd ./.是什么意思
  10. chloe.mysql_Chloe.ORM框架应用实践
  11. C语言程序——摄氏度和华氏度之间的转换
  12. 4年老用户!从R9s Plus换到Find X3,这些体验太上头
  13. 奥园医美将借助奥园集团品牌优势,在中国引入领先医美技术
  14. 呼吸系统药物--平喘药
  15. wxPython in Action 学习笔记一
  16. React使用cra创建项目,开启装饰器
  17. 全选与反选 (转)
  18. 《计算机导论》课后习题答案
  19. 计算机运行原理之电报机与继电器
  20. 海康威视工业相机SDK二次开发环境配置—Windows10+VS2017

热门文章

  1. python网易云_用python爬虫爬取网易云音乐
  2. 王道408数据结构——第三章 栈和队列
  3. python随机抽取人名_python的random
  4. 史上最气人的数学家:文理双全智商还高,说话只说半句,解题只解半个,调戏人调戏了三百年还不够......
  5. 我们来聊点成年人的话题!
  6. 有人问我:AI这么火,要不要去追赶AI的热潮?
  7. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器
  8. c++ 读文件_第十六节:读文件,文件的创建,写文件,文件的读写以及鼠标键盘事件和图形绘制...
  9. pytorch tensor 初始化_PyTorch简明笔记[1]-Tensor的初始化和基本操作
  10. rust火箭基地主楼开启方法_Rust 为什么能成为 Stack Overflow 最受欢迎的语言?