真的分治fft
以前学的分治fft f[i]=sigma(f[i-x]*g[x]),其中g[x]已知
那么我们可以用cdq分治来做(l,mid 对mid+1,t的影响)
而现在的$f[i]=sum(f(i-x)*f(x))$
我们如果沿用刚才的方法 会发现有$f(t-h)$这一项
而$t-h>mid$是有可能的
所以我们要在后续处理这件事情
先将$f[l,mid]*f[l,mid]$乘起来
如果$t-h<h$ 还要算$f[1,t-h]*f[h,mid]$ 注意还要乘2
注意多次用fft 每次还原a,b数组 因为那个n是要比m大的,所以只清空到m的0是有问题的
1e5的数据开O2要2s 预料之中了
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
struct cp{
double a,b;
};
const int N=3e5+;
int n,m,l,r[N],f[N];
int a[N],b[N],w[N],G=;
const int mo=;
const int p=mo;
IL int fsp(rint x,rint y)
{
rint ans=;
while (y)
{
if (y&) ans=(1ll*ans*x)%mo;
x=(1ll*x*x)%mo;
y>>=;
}
return ans;
}
void fft(int *a,int o)
{
for (int i=;i<n;i++)
if (i>r[i]) swap(a[i],a[r[i]]);
for (rint i=;i<n;i*=)
{
rint wn=fsp(G,(p-)/(i*)); w[]=;
rep(j,,i-) w[j]=(1ll*w[j-]*wn)%p;
for (rint j=;j<n;j+=(i*))
{
rint *x=a+j,*y=a+i+j;
for (rint k=;k<i;k++)
{
const int t=(1ll*w[k]*y[k])%p;
y[k]=x[k]-t;
if (y[k]<) y[k]+=p;
if (y[k]>p) y[k]-=p;
x[k]=x[k]+t;
if (x[k]>p) x[k]-=p;
}
}
}
if (o==-)
{
reverse(&a[],&a[n]);
for (int i=,inv=fsp(n,p-);i<n;i++)
a[i]=1ll*a[i]*inv%p;
}
}
void query()
{
l=;
for (n = ; n <= m; n <<= ) l++;
for (int i=;i<n;i++) r[i]=(r[i/]/)|((i&)<<(l-));
fft(a,),
fft(b,);
for (int i=;i<n;i++) a[i]=1ll*a[i]*b[i]%p;
fft(a,-);
}
#define mid ((h+t)/2)
IL void js(rint &x,rint y)
{
x+=y;
x%=mo;
}
void cdq_fz(int h,int t)
{
if (h==t) return;
cdq_fz(h,mid);
if (t-h<h)
{
n=m=t-h+(mid-h+);
rep(i,,t-h) a[i-]=f[i];
rep(i,h,mid) b[i-h]=f[i];
query();
rep(i,mid+,t)
if (i-h->=) js(f[i],(*a[i-h-])%mo);
rep(i,,n) a[i]=b[i]=;
}
n=m=*(mid-h+);
rep(i,h,mid) a[i-h]=b[i-h]=f[i];
query();
rep(i,mid+,t)
if (i-(*h+)>=) js(f[i],a[i-(*h+)]);
rep(i,,n) a[i]=b[i]=;
cdq_fz(mid+,t);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
int k;
cin>>k;
f[]=; f[]=;
cdq_fz(,k);
cout<<f[k]<<endl;
return ;
}
对拍
#include <bits/stdc++.h>
using namespace std;
#define rep(i,h,t) for (int i=h;i<=t;i++)
const int mo=;
int f[];
int main()
{
freopen("1.in","r",stdin);
freopen("2.out","w",stdout);
ios::sync_with_stdio(false);
int n;
cin>>n;
f[]=; f[]=;
rep(i,,n)
rep(k,,i-)
f[i]+=(1ll*f[k]*f[i-k-])%mo,f[i]%=mo;
cout<<f[n]<<endl;
return ;
}
还有说多项式右移
f=f*f>>1+g
真的分治fft的更多相关文章
- [学习笔记]分治FFT
一般的分治FFT是指: https://www.luogu.org/problemnew/show/P4721 考虑后面的f和前面的f有关系,但是贡献可以分着计算,逐一累计上去. 考虑cdq分治.算出 ...
- LOJ#565. 「LibreOJ Round #10」mathematican 的二进制 分治,FFT,概率期望
原文链接www.cnblogs.com/zhouzhendong/p/LOJ565.html 前言 标算真是优美可惜这题直接暴力FFT算一算就solved了. 题解 首先,假装没有进位,考虑解决这个问 ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- 分治FFT的三种含义
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...
- 【XSY2666】排列问题 DP 容斥原理 分治FFT
题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...
- 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp
题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to ...
- prime distance on a tree(点分治+fft)
最裸的点分治+fft,调了好久,太菜了.... #include<iostream> #include<cstring> #include<cstdio> #inc ...
随机推荐
- HTTP笔记01-http相关的基础知识
这个系列文章是阅读<图解HTTP>后写下的笔记 当我们在浏览器输入url,点击回车后,浏览器显示我们需要的web页面,那么,这个界面是如何产生的? 根据浏览器地址中输入的url,浏览器从相 ...
- linux TLB表
TLB - translation lookaside buffer 快表,直译为旁路快表缓冲,也可以理解为页表缓冲,地址变换高速缓存. 由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获 ...
- $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...
- 【原创】Linux基础之文件编码
查看 1 vi $ vi $file:set fileencoding 2 file $ file $file 修改 $ vi $file:set fileencoding=utf-8
- ifconfig和ping
命令: ifconfig 对应英文: configure a network interface 作用: 查看 / 配置计算机当前的网卡配置信息 安装: sudo apt install net-to ...
- C# pdf转word
引用组件 Spire.Pdf,去官网下载安装,在bin目录里面有需要的dll文件. static void Main(string[] args) { #region Pdf转word PdfDocu ...
- MYSQL连不上
如果你想连接你的MySQL的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL serve ...
- git reset --hard xxxxxxx
关于git reset --hard xxxxxxx命令之Git版本回退 今晚代码写着写着就头脑有点发懵,手指也不听使唤了竟然让我敲出了 git reset --hard 命令,然后的然后就是之前所有 ...
- Oracle11g 启动数据库实例、关闭数据库实例
Oracle11g 启动数据库实例 startup 1: nomount 模式: 描述: 该模式只会创建实例(即:创建oracle 实例的各种内存结构和 ...
- Confluence 6 查看一个任务的执行历史
希望查看一个计划任务最后运行的时间和这个计划任务最后一次运行花费了多长时间.单击计划任务边上的 历史(History )连接. 如果一个计划任务从来没有运行的胡啊,那么这个历史的链接是不会显示的. 屏 ...