多项式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 ...
随机推荐
- Jquery全选单选功能
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm6.aspx. ...
- iOS UIProgressView控件用法
IOS中进度条控件的用法总结. 进度条控件是IOS开发中一个简单的系统控件,使用总结如下: 初始化一个进度条: - (instancetype)initWithProgressViewStyle:(U ...
- android自定义activity
今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...
- 与TableView插入、删除、移动、多选,刷新控件
一.插入.删除.移动.多选 方法一: Cell的插入.删除.移动都有一个通用的方法,就是更新tableView的数据源,再reloadData,这样做实现上是简单一点,但是reloadData是刷新整 ...
- Java中的static的使用
Java中的static使用之静态变量 神话丿小王子的博客主页 1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象 ...
- 基于ruby的watir自动化测试 笔记一
基于Ruby的watir-webdriver自动化测试方案与实施(五) 基于Ruby的watir-webdriver自动化测试方案与实施(四) 基于Ruby的watir-webdriver自动 ...
- 玩了一天的Git
今天的逗比事 Git从学习到使用,也有2个月时间了,一开始也就看看廖雪峰老师的Git教程,跟着做了一遍,感觉非常受用. 遇到一些忘掉的命令,再回去查查也基本都没问题. 但是今天缺遇到了逗比事,回过头来 ...
- Git从零开始怎么学?
最近,公司项目代码版本库管理,全部从svn 迁移到Git 最近了解了一段时间 近期会把整个Git使用过程陆续分享 如何从零开始使用Git
- FreeMarker 日期转换
${parameters.fieldDate?date} //标准日期转日期字符串 ${parameters.fie ...
- Windows Server 2012 Recycle Bin corrupted
在Windows Server 2012 上遇到了“The Recycle Bin On E:\ is corrupted. Do you want to empty the Recycle Bin ...