多项式全家桶(完善中)

namespace Polynomial{
const int N=2e6+5,G=3,iG=332748118;
int cir[N],w[N],r[N],sav[N];
void fft(int *f,int len,int t){
for(int i=0;i<len;++i){
cir[i]=(cir[i>>1]>>1)|((i&1)?len>>1:0);
if(i>cir[i])swap(f[i],f[cir[i]]);
}
for(int l=2;l<=len;l<<=1){
int w=qpow(t?G:iG,(mo-1)/l);
for(int i=0;i<len;i+=l){
int fw=1,u,v;
for(int j=i;j<i+l/2;++j,fw=fw*w%mo){
u=f[j],v=f[j+l/2];
f[j]=(u+fw*v%mo)%mo;
f[j+l/2]=(u+mo-fw*v%mo)%mo;
}
}
}
int r=qpow(len,mo-2);
for(int i=0;(!t)&&i<len;++i)f[i]=f[i]*r%mo;
}
void polymul(int *f,int *g,int len){
for(int i=0;i<len;++i)f[i]=f[i]*g[i]%mo;
}
void polycpy(int *f,int *g,int len){//g -> f
for(int i=0;i<len;++i)f[i]=g[i];
}
void polyinv(int *f,int len){
w[0]=qpow(f[0],mo-2);
for(int l=2;l<=len;l<<=1){
polycpy(r,w,l/2);
polycpy(sav,f,l);
fft(w,l*2,1),fft(sav,l*2,1);
polymul(w,w,l*2);
polymul(w,sav,l*2);
fft(w,l*2,0);
for(int i=0;i<l;++i){
w[i]=(2*r[i]+mo-w[i])%mo;
w[i+l]=0;
}
}
polycpy(f,w,len);
for(int i=0;i<len*2;++i){
sav[i]=w[i]=r[i]=0;
}
}
}
posted @   chx#XCPC  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示