洛谷P4239 【模板】多项式求逆(加强版)(多项式求逆)
传送门
咱用的是拆系数\(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 【模板】多项式求逆(加强版)(多项式求逆)相关推荐
- 专题·树链剖分【including 洛谷·【模板】树链剖分
初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...
- 洛谷·【模板】点分树 | 震波【including 点分树
初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...
- 洛谷P2717 寒假作业(cdq分治+归并排序求逆序数)
2020.6.13 君子做事得有担当,这个题目我确实不太明白什么意思,只会O(N^2)的朴素解法,看了下题解才发现有逆序数的弟弟顺序数,用归并就过了?? 先去打cf div2,等会再来研究 代码: # ...
- 255.0.0.0子网掩码相应的cidr前缀表示法是?_【洛谷日报#246】浅谈表达式的求值(Vol.2 进阶)...
Warning 在观看本博客之前,请保证自己理解了表达式的三种表达方式. 本文旨在让大家更深层次的了解表达式,基础的知识就是上方的链接中所写的.所以,在了解后缀表达式的运算原理之后,我将不会讲述类似的 ...
- 洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)
https://www.luogu.com.cn/problem/P1919 题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a ...
- 洛谷 p3372 模板-线段树 1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...
- 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...
- 洛谷.4897.[模板]最小割树(Dinic)
题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...
最新文章
- boost::trait::is_reference 的研究与修改
- android 手机图库获取sd卡图片,关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结...
- 终版!思科网络设备基础命令大全(三)
- mac java+selenium 实现UI自动化1_琉璃
- c++ 该使用类内初始值么?
- 茅塞顿开:Spring Aware原理解析
- 17行代码AC——L1-030 一帮一 (15分)(解题报告)
- 有梦想就有前进的动力
- 从0到1构建美团压测工具
- 计算机的复数英语怎么读,英语的复数怎么读
- 热门还是长尾?大中型网站的关键词优化策略
- SPI、I2C、I2S
- 数据揭秘:中国姓氏排行榜
- 关于:将日文键盘设置为英文键盘
- 语义分割的评价指标——IoU
- 2021-11-09水洗碳带有什么特点
- 使用CSS3设置条纹背景
- 如何读取远程4G网络摄像头的视频流?
- C++primer十万字笔记 第九章 顺序容器
- MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)
热门文章
- pythonalert弹窗_python+selenium八:Alert弹窗
- 均匀白噪声的定义及特点_噪声的物理本质是什么?
- linux硬件 软件raid,Linux下软件RAID的实现
- threejs加载模型挤压变形_车用水阀套零件冷挤压成形数值模拟试验研究
- 页式存储管理程序模拟_ADAS/AD开发12 - 数据存储管理
- wolive-在线客服系统源码_如何搭建在线客服系统?
- python16进制转2进制流_将十六进制文件转换为二进制文件
- php7.0 java 性能,php7代码性能常见优化技巧
- 2017年9月分c语言,2020年9月中国编程语言排行榜
- 前端HTML5CSS动画变形动画之过渡