传送门

咱用的是拆系数\(FFT\)因为咱真的不会三模数\(NTT\)……

简单来说就是把每一次多项式乘法都改成拆系数\(FFT\)就行了

如果您还不会多项式求逆的左转->这里

顺带一提,因为求逆的时候要乘两次,两次分开乘,否则会像咱一样炸精度

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++K]=z[Z],--Z);sr[++K]=' ';
}
const int N=5e5+5,P=1e9+7;const double Pi=acos(-1.0);
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
struct cp{double x,y;cp(double xx=0,double yy=0){x=xx,y=yy;}inline cp operator +(const cp &b)const{return cp(x+b.x,y+b.y);}inline cp operator -(const cp &b)const{return cp(x-b.x,y-b.y);}inline cp operator *(const cp &b)const{return cp(x*b.x-y*b.y,x*b.y+y*b.x);}inline cp operator *(const double &b)const{return cp(x*b,y*b);}
}A[N],B[N],C[N],D[N],E[N],G[N],F[N],H[N],w[N],a[N],b[N],c[N],d[N];
int r[N];
int n,len;
void FFT(cp *A,int ty,int lim){fp(i,0,lim-1)if(i<r[i])swap(A[i],A[r[i]]);for(R int mid=1;mid<lim;mid<<=1)for(R int j=0;j<lim;j+=(mid<<1))for(R int k=0;k<mid;++k){cp x=A[j+k],y=w[mid+k]*A[j+k+mid];A[j+k]=x+y,A[j+k+mid]=x-y;}if(ty==-1){reverse(A+1,A+lim);double k=1.0/lim;fp(i,0,lim-1)A[i]=A[i]*k;}
}
void Mul(cp *a,cp *b,int len,cp *d){int lim=1,l=0;while(lim<(len<<1))lim<<=1,++l;fp(i,0,lim-1)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));for(R int i=1;i<lim;i<<=1)fp(k,0,i-1)w[i+k]=cp(cos(Pi*k/i),sin(Pi*k/i));fp(i,0,len-1){A[i].x=(ll)(a[i].x+0.5)>>15,B[i].x=(ll)(a[i].x+0.5)&32767;C[i].x=(ll)(b[i].x+0.5)>>15,D[i].x=(ll)(b[i].x+0.5)&32767;A[i].y=B[i].y=C[i].y=D[i].y=0;}fp(i,len,lim-1)A[i]=B[i]=C[i]=D[i]=0;FFT(A,1,lim),FFT(B,1,lim),FFT(C,1,lim),FFT(D,1,lim);fp(i,0,lim-1){F[i]=A[i]*C[i],G[i]=A[i]*D[i]+C[i]*B[i],H[i]=B[i]*D[i];}FFT(F,-1,lim),FFT(G,-1,lim),FFT(H,-1,lim);fp(i,0,lim-1){d[i].x=(((ll)(F[i].x+0.5)%P<<30)+((ll)(G[i].x+0.5)<<15)+((ll)(H[i].x+0.5)))%P;d[i].y=0;}
}
void Inv(cp *a,cp *b,int len){if(len==1)return b[0].x=ksm(a[0].x,P-2),void();Inv(a,b,len>>1);Mul(a,b,len,c);Mul(c,b,len,d);fp(i,0,len-1)b[i].x=((ll)(b[i].x+b[i].x-d[i].x)%P+P)%P;
}
int main(){
//  freopen("testdata.in","r",stdin);n=read();fp(i,0,n-1)a[i].x=read();int len=1;while(len<n)len<<=1;Inv(a,b,len);fp(i,0,n-1)print((ll)(b[i].x+0.5)%P);return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10284693.html

洛谷P4239 【模板】多项式求逆(加强版)(多项式求逆)相关推荐

  1. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  2. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  3. 洛谷P2717 寒假作业(cdq分治+归并排序求逆序数)

    2020.6.13 君子做事得有担当,这个题目我确实不太明白什么意思,只会O(N^2)的朴素解法,看了下题解才发现有逆序数的弟弟顺序数,用归并就过了?? 先去打cf div2,等会再来研究 代码: # ...

  4. 255.0.0.0子网掩码相应的cidr前缀表示法是?_【洛谷日报#246】浅谈表达式的求值(Vol.2 进阶)...

    Warning 在观看本博客之前,请保证自己理解了表达式的三种表达方式. 本文旨在让大家更深层次的了解表达式,基础的知识就是上方的链接中所写的.所以,在了解后缀表达式的运算原理之后,我将不会讲述类似的 ...

  5. 洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

  6. 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)

    https://www.luogu.com.cn/problem/P1919 题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a ...

  7. 洛谷 p3372 模板-线段树 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...

  8. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)

    题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...

  9. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

最新文章

  1. boost::trait::is_reference 的研究与修改
  2. android 手机图库获取sd卡图片,关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结...
  3. 终版!思科网络设备基础命令大全(三)
  4. mac java+selenium 实现UI自动化1_琉璃
  5. c++ 该使用类内初始值么?
  6. 茅塞顿开:Spring Aware原理解析
  7. 17行代码AC——L1-030 一帮一 (15分)(解题报告)
  8. 有梦想就有前进的动力
  9. 从0到1构建美团压测工具
  10. 计算机的复数英语怎么读,英语的复数怎么读
  11. 热门还是长尾?大中型网站的关键词优化策略
  12. SPI、I2C、I2S
  13. 数据揭秘:中国姓氏排行榜
  14. 关于:将日文键盘设置为英文键盘
  15. 语义分割的评价指标——IoU
  16. 2021-11-09水洗碳带有什么特点
  17. 使用CSS3设置条纹背景
  18. 如何读取远程4G网络摄像头的视频流?
  19. C++primer十万字笔记 第九章 顺序容器
  20. MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)

热门文章

  1. pythonalert弹窗_python+selenium八:Alert弹窗
  2. 均匀白噪声的定义及特点_噪声的物理本质是什么?
  3. linux硬件 软件raid,Linux下软件RAID的实现
  4. threejs加载模型挤压变形_车用水阀套零件冷挤压成形数值模拟试验研究
  5. 页式存储管理程序模拟_ADAS/AD开发12 - 数据存储管理
  6. wolive-在线客服系统源码_如何搭建在线客服系统?
  7. python16进制转2进制流_将十六进制文件转换为二进制文件
  8. php7.0 java 性能,php7代码性能常见优化技巧
  9. 2017年9月分c语言,2020年9月中国编程语言排行榜
  10. 前端HTML5CSS动画变形动画之过渡