写完帕秋莉的超级多项式于是正好贴个模板大汇总(带优化的那种...)

//by Judge
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=998244353;
const int iG=332748118;
const int M=3e5+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int inc(int x,int y){return (x+y)%mod;}
inline int dec(int x,int y){return (x-y+mod)%mod;}
inline int Dec(int x,int y){return x<y?x-y+mod:x-y;}
inline int Inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int read(){ int x=0,f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr=' '){if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,k,d,limit; arr a,b,r[21],lg,inv,G[2];
inline int qpow(Rg int x,Rg int p=mod-2,Rg int s=1){for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
}
inline void prep(int n){inv[1]=1; for(limit=1;limit<=n;limit<<=1);fp(i,2,limit) inv[i]=mul(mod-mod/i,inv[mod%i]);fp(d,1,19){ lg[1<<d]=d; fp(i,0,(1<<d)-1)r[d][i]=(r[d][i>>1]>>1)|((i&1)<<(d-1));}for(Rg int t=(mod-1)>>1,i=1,x,y;i<262144;i<<=1,t>>=1){x=qpow(3,t),y=qpow(iG,t),G[0][i]=G[1][i]=1;fp(k,1,i-1) G[1][i+k]=mul(G[1][i+k-1],x),G[0][i+k]=mul(G[0][i+k-1],y);}
}
inline void NTT(int* a,int tp){fp(i,0,limit-1) if(i<r[d][i]) swap(a[i],a[r[d][i]]);for(Rg int mid=1;mid<limit;mid<<=1){ int I=mid<<1;for(Rg int j=0,x,y;j<limit;j+=I) fp(k,0,mid-1)x=a[j+k],y=mul(G[tp][mid+k],a[j+k+mid]),a[j+k]=(x+y)%mod,a[j+k+mid]=(x-y+mod)%mod;}if(tp) return ; fp(i,0,limit-1) a[i]=mul(a[i],inv[limit]);
}
inline void init(Rg int n){ d=0;for(limit=1;limit<=n;limit<<=1)++d;
}
void Inv(int* a,int* b,int n){static arr C,D; if(n==1) return b[0]=qpow(a[0]),void();Inv(a,b,n>>1),init(n); fp(i,0,n-1) C[i]=a[i],D[i]=b[i];fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);fp(i,0,limit-1) C[i]=mul(C[i],mul(D[i],D[i])); NTT(C,0);fp(i,0,n-1) b[i]=dec(inc(b[i],b[i]),C[i]); fp(i,n,limit-1) b[i]=0;
}
void Sqrt(int* a,int* b,int n){static arr D,F; if(n==1) return b[0]=sqrt(a[0]),void();Sqrt(a,b,n>>1); fp(i,0,n<<1) F[i]=0;Inv(b,F,n),init(n); fp(i,0,n-1) D[i]=a[i];fp(i,n,limit-1) D[i]=0; NTT(D,1),NTT(b,1),NTT(F,1);fp(i,0,limit-1) b[i]=mul(inc(b[i],mul(D[i],F[i])),inv[2]);NTT(b,0); fp(i,n,limit-1) b[i]=0;memset(D,0,limit<<2),memset(F,0,limit<<2);
}
inline void Direv(int* a,int* b,int n){fp(i,1,n-1) b[i-1]=mul(a[i],i); b[n-1]=b[n]=0;
}
inline void Inter(int* a,int* b,int n){fp(i,1,n-1) b[i]=mul(a[i-1],inv[i]); b[0]=0;
}
inline void Ln(int* a,int* b,int n){static arr A,B; Direv(a,A,n),Inv(a,B,n);init(n),NTT(A,1),NTT(B,1);fp(i,0,limit-1) A[i]=mul(A[i],B[i]);NTT(A,0),Inter(A,b,limit);memset(A,0,limit<<2),memset(B,0,limit<<2);
}
inline void Exp(int* a,int* b,int n){static arr F; if(n==1) return b[0]=1,void();Exp(a,b,n>>1),Ln(b,F,n),init(n);F[0]=dec(a[0]+1,F[0]); fp(i,1,n-1) F[i]=dec(a[i],F[i]);NTT(F,1),NTT(b,1); fp(i,0,limit-1) b[i]=mul(b[i],F[i]);NTT(b,0); fp(i,n,limit-1) b[i]=0; memset(F,0,limit<<2);
}
inline void Pow(int* a,int* b,int n,int k){static arr F; memset(F,0,n<<2),Ln(a,F,n);fp(i,0,n-1) F[i]=mul(F[i],k); Exp(F,b,n);
}
int main(){ prep(1<<19);return 0;
}

转载于:https://www.cnblogs.com/Judge/p/10735653.html

【全家福】多项式的各种板子相关推荐

  1. [PKUWC2018][loj2541]猎人杀

    前言 先是容斥 分治套NTT 题意简介 题目链接 题目大意 现在有nnn个猎人,每个猎人都有一个值wiw_iwi​ 进行nnn次杀人,死掉的人不会再被杀 每次杀人过程中第iii个猎人被杀的概率为wi∑ ...

  2. GDOI2021自闭记

    是真的自闭了 凭借noip只有100分,WC只有138的严重失误造成的垃圾成绩,我省选必须比队线高200+分才有可能进队 去年都能打进D类,今年noip+WC连前100都打不到 考前没怎么停课,自己随 ...

  3. [LOJ#2983][WC2019]数树

    Address 洛谷 P5206 LOJ #2983 Solution 这是一道计数 (shen) 好 (xian) 题,综合性很强 ,虽然是三合一 鉴于此题用到的算法较多,我就不在标题里列出了,此题 ...

  4. 「学习笔记」多项式相关

    序 学多项式也有好久了,可是我自己还没怎么认认真真推过柿子,导致啥都不会,然后被吊打. 看来再不回顾一下就不行了啊. 多项式乘法 写了一个好看一点的\(\mathrm{NTT}\)板子,仅供参考. i ...

  5. 多项式基础操作 - 学习笔记

    原文链接https://www.cnblogs.com/zhouzhendong/p/polynomial.html 下载链接: 多项式基础操作 #include <bits/stdc++.h& ...

  6. 多项式全家桶学习笔记【持续更新】

    本文完成的时间跨度较长,文风变化可能较大-- 最近更新于2020年2月17日 Part 1.主线 乘法 前面讲过FFT 然而FFT常数感人,适用范围还窄,比如不能取模 于是有了NTT 其实就是取模的F ...

  7. 模板:多项式乘法(FFTNTT)

    文章目录 前言 系数表示法和点值表示法 单位根 离散傅立叶变换(DFT) 位逆序置换(蝴蝶变换) 离散傅立叶逆变换(IDFT) 代码 NTT 代码 所谓快速傅立叶变换,就是傅立叶发明的一种快速的变换 ...

  8. 快速数论变换与多项式常用运算

    导入 一般来说,我们需要进行的操作是在模意义下的. 此时我们就无法使用单位根和实数意义下的FFT了. 我们的解决办法是: 原根 我们选择单位根是因为其具有良好的性质可以被我们利用. 如果我们在模意义下 ...

  9. 生成函数多项式操作合集

    一.生成函数与多项式乘法. 众所周知,生成函数是OI中的计数利器,而很多生成函数的题目需要快速计算式子中的多项式运算,所以本篇主要是介绍多项式运算的. 值得注意的是,这里很多奇怪的多项式运算本来是不存 ...

  10. 题解 P5265 【模板】多项式反三角函数

    →_→ OI 生涯晚期才开始刷板子题的咱 其实这题就是道公式题,搞过多项式全家桶的同学贴贴板子照着公式码两下都能过... 至于公式的证明嘛...总之贴上公式: \[Arcsin(F)=\int{F'\ ...

最新文章

  1. js中document.write的那点事
  2. FPGA之道(42)FPGA设计的分类
  3. 《Android应用开发》——1.3节配置Eclipse
  4. 基于SSM实现小区物业管理系
  5. Faster R-CNN源码中ROI Pooling的解析
  6. 深入V8引擎-写在前面
  7. mysql电商数据库设计文档_MySQL电商项目数据库设计及架构优化视频课程
  8. 【文献阅读】深度时空网络风力预测(Jiangyuan Li等人,ArXiv,2021)
  9. 【信息系统项目管理师】2018下半年系统集成项目管理工程师案例分析
  10. Python中文字符串,变成英文字符串
  11. 成都大数据培训前景:2020年大数据趋势
  12. qemu: usb存储设备仿真
  13. iframe 跳转到其他页面
  14. 企业邮箱设置,企业邮箱服务器怎么设置?
  15. 学习笔记-SNN用STDP法的MNIST数据集识别代码深入阅读
  16. oracle中的递归查询
  17. 【JAVA_POI】解析PPT文档(ppt和pptx)4.1.2版本
  18. 2021美赛写作(一)
  19. SpringMVC+FastJson+Swagger集成完整示例
  20. Lua-cjson使用笔记

热门文章

  1. 02-Swift学习笔记-元组类型
  2. 价值5000元的报表分享
  3. Extjs 4.1 学习笔记(二)(panel 自适应高度)
  4. Linux 网络编程基础(一) ---------------客户端/服务器的简单实现
  5. PP-OCR论文笔记
  6. FLAT:又快又好的中文命名实体识别模型
  7. 36岁青椒的“我”想对26岁读博的“你”说些话
  8. 论文赏析[NAACL19]基于DIORA的无监督隐式句法树归纳
  9. 从零实现深度学习框架——自动求导神器计算图
  10. 入门佳作《例解Python》来了!案例丰富尽显风度ƪ(´▽`ƪ)