多项式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 ...
随机推荐
- HDOJ1001-1005题解
1001--Sum Problem(http://acm.hdu.edu.cn/showproblem.php?pid=1001) #include <stdio.h> int sum(i ...
- 【代码笔记】iOS-判断是否是iPhone5
一,代码. #import "RootViewController.h" // 判断是否是iPhone5 #define iPhone5 ([UIScreen instancesR ...
- 【代码笔记】iOS-翻页效果的实现
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- Ubuntu/Windows双系统修复引导
Ubuntu/Windows双系统修复引导 首先说明:在Windows存在的前提下安装Ubuntu(或者Ubuntu系列)是不需要修复引导的.因为grub会自动搜索存在硬盘中的系统. 而在Ub ...
- ORACLE手工删除数据库
很多人习惯用ORACLE的DBCA工具创建.删除数据库,这里总结一下手工删除数据库实验的步骤,文中大量参考了乐沙弥的手动删除ORACLE数据库这篇博客的内容,当然还有Oracle官方相关文档.此处实验 ...
- HTML制作个人简历
简历代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- 56相册视频(土豆相册视频 激动相册视频 QQ动感影集等)——下载教程
由于目前流行的相册视频或影集大多是由Flash.音乐和图片组合而成的动画,不属于完整视频,所以不能用常规的解析方法下载. 鉴于很多朋友希望可以下载自己精心制作的相册,故在本教程中,我们将以图文并茂的方 ...
- Mysql中使用find_in_set函数查找字符串
mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...
- Linux和开源已经在2013年开始悄悄主宰世界?
提到Linux,很多人觉得它依旧不温不火,实际上在这个即将过去的一年,Linux和开源软件已经悄悄主宰了计算领域的各方面,这具体表现在开源项目遍地、Chromebook崛起、SteamOS备受瞩目、A ...
- Linux laptop-mode 电池供电时鼠标间歇失灵问题解决
/*本文地址http://www.cnblogs.com/go2bed/p/4298689.html */ 这个问题网上已经有很多人讨论过了.例如<解决ubuntu使用笔记本自带电池后鼠标断电或 ...