多项式FFT相关模板
自己码了一个模板...有点辛苦...常数十分大,小心使用
#include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <algorithm> #include <vector> using namespace std; #define ll long long #define pb push_back ll MOD=; #define SZ 666666 ll w[][SZ]; ll qp(ll a,ll b) { ll ans=; while(b) { ) ans=ans*a%MOD; a=a*a%MOD; b>>=; } return ans; } int K; void fftinit(int n) { ;K<n;K<<=); w[][]=w[][K]=; ll g=qp(,(MOD-)/K); //3是原根 ;i<K;i++) w[][i]=w[][i-]*g%MOD; ;i<=K;i++) w[][i]=w[][K-i]; } void fft(int* x,int v) { ,j=;i<K;i++) { if(i>j) {x[i]^=x[j]; x[j]^=x[i]; x[i]^=x[j];} ;(j^=l)<l;l>>=); } ;i<=K;i<<=) { ;j<K;j+=i) { ;l<i>>;l++) { ll t=(ll)x[j+l+(i>>)]*w[v][K/i*l]%MOD; x[j+l+(i>>)]=(x[j+l]-t+MOD)%MOD; x[j+l]=(x[j+l]+t)%MOD; } } } if(!v) return; ll rv=qp(K,MOD-); ;i<K;i++) x[i]=x[i]*rv%MOD; } struct poly { vector<int> ps; ;} int& operator [] (int x) {return ps[x];} //ps.at(x) );} void dbg() { ; ;i--) { if(!ps[i]) continue; if(fi) { ) printf("+%d",ps[i]); ) printf("+"); ) printf("-"); else printf("+%d",ps[i]); } else { ) printf("%d",ps[i]); ); ) printf("-"); else printf("%d",ps[i]); } ) printf("x^%d",i); ) printf("x"); fi=; } "); putchar(); } void clr() { ; ]) --p; sc(p-); } }; ll gm(ll x) { x=x%MOD; ) x+=MOD; return x; } namespace PolyMul{int ta[SZ],tb[SZ],tc[SZ];} poly operator * (poly a,poly b) { using namespace PolyMul; ||b.cs()<) { poly g; g.sc(a.cs()+b.cs()); ;i<=a.cs();i++) { ;j<=b.cs();j++) g[i+j]=gm(g[i+j]+a[i]*(ll)b[j]%MOD); } return g; } poly c; int t=a.cs()+b.cs(); c.sc(t); fftinit(t+); memset(ta,,sizeof(int)*K); memset(tb,,sizeof(int)*K); memset(tc,,sizeof(int)*K); ;i--) ta[i]=a[i]; ;i--) tb[i]=b[i]; fft(ta,); fft(tb,); ;i<K;i++) tc[i]=(ll)ta[i]*tb[i]%MOD; fft(tc,); ;i--) c[i]=tc[i]; c.clr(); return c; } namespace PolyInv{int ay[SZ],a0[SZ],tmp[SZ];} void ginv(int t) { using namespace PolyInv; ) {a0[]=qp(ay[],MOD-); return;} ginv((t+)>>); fftinit(t+t+); memset(tmp,,sizeof(int)*K); ; ;i<t;i++) tmp[i]=ay[i]; fft(tmp,); fft(a0,); ;i<K;i++) a0[i]=gm((-(ll)tmp[i]*a0[i])%MOD*a0[i]); fft(a0,); ; } poly inv(poly x) { using namespace PolyInv; poly y; y.sc(x.cs()); ;i--) ay[i]=x[i]; ginv(x.cs()+); ;i--) y[i]=a0[i]; y.clr(); return y; } poly operator + (poly a,poly b) { poly w; w.sc(max(a.cs(),b.cs())); ;i--) w[i]=a[i]; ;i--) w[i]+=b[i], w[i]=gm(w[i]); return w; } poly operator - (poly a,poly b) { poly w; w.sc(max(a.cs(),b.cs())); ;i--) w[i]=a[i]; ;i--) w[i]-=b[i], w[i]=gm(w[i]); w.clr(); return w; } void div(poly a,poly b,poly& d,poly& r) { int n=a.cs(),m=b.cs(); ); d[]=; r=a; return;} fftinit(*n); poly aa=a; reverse(aa.ps.begin(),aa.ps.end()); poly bb=b; reverse(bb.ps.begin(),bb.ps.end()); bb.sc(n-m); bb=inv(bb); d=aa*bb; d.sc(n-m); reverse(d.ps.begin(),d.ps.end()); r=a-b*d; r.clr(); } poly operator / (poly a,poly b) { poly d,r; div(a,b,d,r); return d; } poly operator % (poly a,poly b) { poly d,r; div(a,b,d,r); return r; } poly dev(poly x) { ;i<=x.cs();i++) x[i-]=(ll)x[i]*i%MOD; x.sc(x.cs()-); return x; } poly inte(poly x) //C=0 { x.sc(x.cs()+); ;i--) x[i]=x[i-]; x[]=; ;i--) x[i]=(ll)x[i]*qp(i,MOD-)%MOD; return x; } ll qz_(poly& a,ll x) { ll ans=; ;i--) ans=(ans*x%MOD+a[i])%MOD; return gm(ans); } namespace PolyGetv{int xs[SZ],anss[SZ];}; void gv(poly f,int m,int* x,int* ans) { //f.clr(); ) { ;i<=m;i++) ans[i]=qz_(f,x[i]); return; } poly m0,m1,tmp; m0.sc(); m1.sc(); tmp.sc(); m0[]=m1[]=; tmp[]=; ; ;i<=hf;i++) tmp[]=gm(-x[i]), m0=m0*tmp; ;i<=m;i++) tmp[]=gm(-x[i]), m1=m1*tmp; gv(f%m0,hf,x,ans); gv(f%m1,m-hf,x+hf+,ans+hf+); } vector<int> getv(poly a,vector<int> x) { using namespace PolyGetv; a.clr(); if(!x.size()) return vector<int>(); ; ;i<=m;i++) xs[i]=x[i]; gv(a,m,xs,anss); vector<); ;i<=m;i++) ans[i]=anss[i]; return ans; } int main() { }
加减乘逆元除取模求导积分多点求值...感觉够用了。
大部分运算没有用题目测试过...都是小数据/目测啥的...有问题求评论告知。
相关介绍请见picks博客及上一篇FFT入门。
http://picks.logdown.com/posts/177631-fast-fourier-transform
http://picks.logdown.com/posts/189620-inverse-element-of-polynomial
http://picks.logdown.com/posts/197262-polynomial-division
http://www.cnblogs.com/zzqsblog/p/5665654.html
多项式FFT相关模板的更多相关文章
- 多项式FFT/NTT模板(含乘法/逆元/log/exp/求导/积分/快速幂)
自己整理出来的模板 存在的问题: 1.多项式求逆常数过大(尤其是浮点数FFT) 2.log只支持f[0]=1的情况,exp只支持f[0]=0的情况 有待进一步修改和完善 FFT: #include&l ...
- 快速傅里叶变换(FFT)相关内容汇总
(原稿:https://paste.ubuntu.com/p/yJNsn3xPt8/) 快速傅里叶变换,是求两个多项式卷积的算法,其时间复杂度为$O(n\log n)$,优于普通卷积求法,且根据有关证 ...
- FFT快速傅里叶模板
FFT快速傅里叶模板…… /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < ...
- 多项式乘法(FFT)模板 && 快速数论变换(NTT)
具体步骤: 1.补0:在两个多项式最前面补0,得到两个 $2n$ 次多项式,设系数向量分别为 $v_1$ 和 $v_2$. 2.求值:用FFT计算 $f_1 = DFT(v_1)$ 和 $f_2=DF ...
- Note -「多项式」基础模板(FFT/NTT/多模 NTT)光速入门
进阶篇戳这里. 目录 何为「多项式」 基本概念 系数表示法 & 点值表示法 傅里叶(Fourier)变换 概述 前置知识 - 复数 单位根 快速傅里叶正变换(FFT) 快速傅里叶逆变换(I ...
- luogu P4238 多项式求逆 (模板题、FFT)
手动博客搬家: 本文发表于20181125 13:21:46, 原地址https://blog.csdn.net/suncongbo/article/details/84485718 题目链接: ht ...
- 多项式细节梳理&模板(多项式)
基础 很久以前的多项式总结 现在的码风又变了... FFT和NTT的板子 typedef complex<double> C; const double PI=acos(-1); void ...
- UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 题目传送门 - UOJ#23 题意 给定一个有 n 个节点的仙人掌(可能有重边). 对于所有 ...
- hdu 1402 FFT(模板)
A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- VSS提示"Could not find the Visual SourceSafe Internet Web Service connection information for the specified database
转自:http://www.cnblogs.com/qqflying/archive/2007/12/18/1004051.html VSS连接错误提示: ====================== ...
- UILabel用法
// UILabel -> UIView // UILabel用来显示文字内容 //创建一个Label,一般都直接通过initWithFrame确定位置跟大小 UILabel *lb = [[U ...
- Android 创建一个新的Activity
本文转载自:http://www.cnblogs.com/wuyudong/p/5658020.html 新建一个项目,创建一个java类,继承自Activity 新建一个Android.xml文件: ...
- CGAffineTransform方法汇总
CGAffineTransform是二维的仿射变换,可以进行位移,旋转,缩放,CGAffineTransform实际上是一个矩阵. CGAffineTransform { CGFloat a, b, ...
- cocoapod-使用cocoapod安装AFNetworking3.0
1. 在终端用cd命令加入到工程目录下,用命令:touch Podfile创建一个Podfile文件. 2. Podfile文件: #source 'https://github.com/CocoaP ...
- cocoapods卸载与安装的各种坑
在mac上安装cocoapods,一路的坑啊,无数报错啊有木有! 本以为安装很简单,mac下都自带ruby,使用ruby的gem命令即可下载安装: $ sudo gem install cocoapo ...
- 理解 Statement 和 PreparedStatement
java,servlet中的PreparedStatement 接口继承了Statement,并与之在两方面有所不同:有人主张,在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以Prepar ...
- xdebug + wincachegrind
;;;;;;;php.ini;;;;;;;;;;;;;;;;;; [Xdebug]zend_extension=D:\Xampp\php\ext\php_xdebug.dll;开启自动跟踪xdebug ...
- 创建用户故事地图(User Story Mapping)的8个步骤
[小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...
- Java基础知识学习(七)
线程(续) 线程同步 当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用.达到此目的的过程叫做同步(synchronization) 可以用两种方法同步化代码.两者 ...