多项式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 ...
随机推荐
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- iOS里常见的几种信息编码、加密方法简单总结
一.MD5 MD5编码是最常用的编码方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码. MD5主要特点是 不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样(也不是绝对的 ...
- PCM(Pulse-code modulation)脉冲编码调制
在音频处理中,我们会经常听到PCM数据,那么什么是PCM数据呢? PCM数据就是模拟信号经过PCM以后的数字信号,PCM就是把音频信号由模拟信号(时间连续,取值连续)转为数字信号(时间离散,取值离散) ...
- Mac 常用快捷键
Command+Tab 任意情况下切换应用程序 - 向前循环 Shift+Command+Tab 切换应用程序 - 向后循环 Command+Delete 把选中的资源移到废纸篓 Shift+Comm ...
- MySQL如何发型不乱的应对半年数十TB数据增量
➠更多技术干货请戳:听云博客 前段时间,Oracle官方发布了MySQL 5.7的GA版本.新版本中实现了真正意义的并行复制(基于Group Commit的Group Replication),而不 ...
- javascript中,如何判断input中输入的为纯数字
用正则表达式判断.如果纯数字是指整数的话(不包含小数点),可以这样: function check(){ var value = document.getElementById("input ...
- IOS开发之UI布局
前言:本篇随笔会经常更新,随着本人对布局的深入学习,会不断补充新的知识.新的使用技巧.新的认识等等. 1.Autoresizing(在代码中使用) 先简单的看看下面的代码,以及左边运行出来的效果,然后 ...
- android 多线程下载 断点续传
来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
- 示例详解:UIScrollview 与 Autolayout 的那点事
前言 自从写了介绍Masonry那篇文章以后 就一直有人对UIScrollView的那个例子不是很理解 UIView *container = [UIView new]; [scrollView ad ...
- Memcache知识点梳理
Memcache知识点梳理 Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...