| 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){ |
| 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; |
| } |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效