多项式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 ...
随机推荐
- pod install 和 pod update的区别
pod install 和 pod update的区别 pod install(下载并安装pod) 1,当pod file文件中有“增加pod,删除pod,修改pod”的操作之后使用. 2,pod i ...
- 我的android学习经历7
android签名后报错的问题 Duplicate id @+id/imageView, already defined earlier in this layout,android生成报错 这个是项 ...
- get请求报文
GET /02_WEB_HTTP/index.html?username=admin&password=123123 HTTP/1.1 Accept: application/x-ms-app ...
- 验证位置时发生错误:“org.tigris.subversion.javahl.ClientException......
验证位置时发生错 误:“org.tigris.subversion.javahl.ClientException: RA layer request failed svn: Server sent u ...
- Enabling Cross-Origin Requests in ASP.NET Web API 2
Introduction This tutorial demonstrates CORS support in ASP.NET Web API. We’ll start by creating two ...
- Windows Phone Studio-任何人都能开发Windows Phone App的在线工具
在一段时间的内测以后,微软于今天早些时候发布了其Windows Phone应用开发的在线工具,名字叫做Windows Phone Studio.其意义在于,通过简单的内容添加和样式选择,实现Windo ...
- MySQL 系列(五) 多实例、高可用生产环境实战
MySQL 系列(五) 多实例.高可用生产环境实战 第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...
- php截取字符串函数
public function sub_string($str, $len, $charset="utf-8") { if( !is_numeric($len) or $len & ...
- 遍历map的常用方法
Map< String, String> map = new HashMap<String, String>(); map.put("a", " ...
- .NET领域驱动设计—实践(穿过迷雾走向光明)
阅读目录 开篇介绍 1.1示例介绍 (OnlineExamination在线考试系统介绍) 1.2分析.建模 (对真实业务进行分析.模型化) 1.2.1 用例分析 (提取系统的所有功能需求) 1.3系 ...