1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int N=4000005; // 4 times!
  5. const int mod=998244353,g=3;
  6. int qpow(int p,int q) {
  7. int r = 1;
  8. for(; q; p*=p, p%=mod, q>>=1) if(q&1) r*=p, r%=mod;
  9. return r;
  10. }
  11. int inv(int p) {
  12. return qpow(p, mod-2);
  13. }
  14. namespace NTT {
  15. #define pw(n) (1<<n)
  16. const int N=4000005; // 4 times!
  17. const int mod=998244353,g=3;
  18. int n,m,bit,bitnum,a[N+5],b[N+5],rev[N+5];
  19. void getrev(int l){
  20. for(int i=0;i<pw(l);i++){
  21. rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
  22. }
  23. }
  24. int fastpow(int a,int b){
  25. int ans=1;
  26. for(;b;b>>=1,a=1LL*a*a%mod){
  27. if(b&1)ans=1LL*ans*a%mod;
  28. }
  29. return ans;
  30. }
  31. void NTT(int *s,int op){
  32. for(int i=0;i<bit;i++)if(i<rev[i])swap(s[i],s[rev[i]]);
  33. for(int i=1;i<bit;i<<=1){
  34. int w=fastpow(g,(mod-1)/(i<<1));
  35. for(int p=i<<1,j=0;j<bit;j+=p){
  36. int wk=1;
  37. for(int k=j;k<i+j;k++,wk=1LL*wk*w%mod){
  38. int x=s[k],y=1LL*s[k+i]*wk%mod;
  39. s[k]=(x+y)%mod;
  40. s[k+i]=(x-y+mod)%mod;
  41. }
  42. }
  43. }
  44. if(op==-1){
  45. reverse(s+1,s+bit);
  46. int inv=fastpow(bit,mod-2);
  47. for(int i=0;i<bit;i++)a[i]=1LL*a[i]*inv%mod;
  48. }
  49. }
  50. void solve(vector <int> A,vector <int> B,vector <int> &C) {
  51. n=A.size()-1;
  52. m=B.size()-1;
  53. for(int i=0;i<=n;i++) a[i]=A[i];
  54. for(int i=0;i<=m;i++) b[i]=B[i];
  55. m+=n;
  56. bitnum=0;
  57. for(bit=1;bit<=m;bit<<=1)bitnum++;
  58. getrev(bitnum);
  59. NTT(a,1);
  60. NTT(b,1);
  61. for(int i=0;i<bit;i++)a[i]=1LL*a[i]*b[i]%mod;
  62. NTT(a,-1);
  63. C.clear();
  64. for(int i=0;i<=m;i++) C.push_back(a[i]);
  65. for(int i=0;i<=min(m*2,N-1);i++) a[i]=b[i]=0;
  66. }
  67. }
  68. struct poly {
  69. vector <int> a;
  70. void cut(int n) {
  71. while(a.size()>n) a.pop_back();
  72. }
  73. poly getcut(int n) {
  74. poly A=*this;
  75. A.cut(n);
  76. return A;
  77. }
  78. void read() {
  79. int n;
  80. cin>>n;
  81. for(int i=0;i<n;i++) {
  82. int t;
  83. cin>>t;
  84. a.push_back(t);
  85. }
  86. }
  87. void print() {
  88. for(int i=0;i<a.size();i++) cout<<a[i]<<" ";
  89. cout<<endl;
  90. }
  91. poly operator *(int b) {
  92. poly c=*this;
  93. for(int i=0;i<a.size();i++) (((c.a[i]*=b)%=mod)+=mod)%=mod;
  94. return c;
  95. }
  96. poly operator *(const poly &b) {
  97. poly c;
  98. NTT::solve(a,b.a,c.a);
  99. return c;
  100. }
  101. poly operator +(poly b) {
  102. int len=max(a.size(),b.a.size());
  103. a.resize(len);
  104. b.a.resize(len);
  105. poly c;
  106. for(int i=0;i<len;i++) c.a.push_back((a[i]+b.a[i])%mod);
  107. return c;
  108. }
  109. poly operator -(poly b) {
  110. int len=max(a.size(),b.a.size());
  111. a.resize(len);
  112. b.a.resize(len);
  113. poly c;
  114. for(int i=0;i<len;i++) c.a.push_back(((a[i]-b.a[i])%mod+mod)%mod);
  115. return c;
  116. }
  117. poly getinv(poly A, int n) {
  118. A.cut(n);
  119. poly B;
  120. if(n==1) {
  121. B.a.push_back(inv(A.a[0]));
  122. }
  123. else {
  124. poly Bi = getinv(A,(n-1)/2+1);
  125. B = Bi*2 - A*Bi*Bi;
  126. B.cut(n);
  127. }
  128. return B;
  129. }
  130. poly getinv() {
  131. int n=a.size();
  132. poly A=*this;
  133. return getinv(A,n);
  134. }
  135. poly getderi() {
  136. poly A=*this;
  137. poly B;
  138. for(int i=1;i<A.a.size();i++) B.a.push_back(A.a[i]*i%mod);
  139. return B;
  140. }
  141. poly getinte() {
  142. poly A=*this;
  143. poly B;
  144. B.a.push_back(0);
  145. for(int i=0;i<=A.a.size();i++) B.a.push_back(A.a[i]*inv(i+1)%mod);
  146. return B;
  147. }
  148. poly getln() {
  149. poly A=*this;
  150. int n=a.size();
  151. return (A.getderi()*A.getinv()).getinte().getcut(n);
  152. }
  153. };
  154. int n,a[N];
  155. signed main() {
  156. ios::sync_with_stdio(false);
  157. poly A;
  158. A.read();
  159. A.getln().print();
  160. }

多项式对数函数 - NTT的更多相关文章

  1. 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 ...

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

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

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

    手动博客搬家: 本文发表于20181127 08:39:42, 原地址https://blog.csdn.net/suncongbo/article/details/84559818 题目链接: ht ...

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

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

  5. JZYZOJ 2042 多项式逆元 NTT 多项式

    http://172.20.6.3/Problem_Show.asp?id=2042 题意:求一个次数界为n的多项式在模P并模x^m的意义下的逆元.P=7*17*2^23+1. 多项式逆元的含义以及求 ...

  6. UOJ#34. 多项式乘法(NTT)

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

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

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

  8. 洛谷P3803 【模板】多项式乘法 [NTT]

    题目传送门 多项式乘法 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字, ...

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

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

随机推荐

  1. 显示层封装及实现与优化(无动画+css3动画+js动画)

    showhide.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. Android-ServiceManager

    ServiceManager在init进程启动之后启动,用来管理系统中的service,那么首先理解一下在init进程启动之后启动这句话类: 一般开机过程分为三个阶段: OS级别,由bootloade ...

  3. 「Flink」事件时间与水印

    我们先来以滚动时间窗口为例,来看一下窗口的几个时间参数与Flink流处理系统时间特性的关系. 获取窗口开始时间Flink源代码 获取窗口的开始时间为以下代码: org.apache.flink.str ...

  4. 邓士鹏【MySql大全】

    禁止使用系统关键字: typename 1.计算两个日期的时间差函数 SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01'); interval可是 ...

  5. [Contract] Solidity 遍历 mapping 的一种方式

    思路:为需要遍历的 mapping 再准备一个 list,之后通过 for 循环遍历 list 取得 mapping 的 key. mapping (address => uint) users ...

  6. 使用十年的电脑在家用记事本调试 .NET 程序

    引言 春节放假回老家,没有把笔记本电脑带上,由于肺炎疫情的原因只能呆在家里,写的一个WinForm程序无法正常使用,需要及时修复,看我如何使用家里十年的台式机来调试修复 .NET 应用程序. WinF ...

  7. SpringBoot整合NoSql--(四)Session共享

    简介: 正常情况下,HttpSession是通过Servlet 容器创建并进行管理的,创建成功之后都是保存在内存中.如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均 ...

  8. 令人抓狂的redis和rediscluster Python驱动包的安装

    本文环境:centos 7,Python3编译安装成功,包括pip3,然后需要安装redis相关的Python3驱动包,本的redis指redis包而非redis数据库,rediscluster类似. ...

  9. 每隔n步循环删除,返回最后一个元素

    题目:有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置.以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0-& ...

  10. 解决问题:当redis服务端断开的时候`进程会崩溃(转载6哥笔记)

    package main import ( "fmt" "github.com/astaxie/beego/logs" "github.com/gar ...