以前学的分治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的更多相关文章

  1. [学习笔记]分治FFT

    一般的分治FFT是指: https://www.luogu.org/problemnew/show/P4721 考虑后面的f和前面的f有关系,但是贡献可以分着计算,逐一累计上去. 考虑cdq分治.算出 ...

  2. LOJ#565. 「LibreOJ Round #10」mathematican 的二进制 分治,FFT,概率期望

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ565.html 前言 标算真是优美可惜这题直接暴力FFT算一算就solved了. 题解 首先,假装没有进位,考虑解决这个问 ...

  3. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

  4. hdu 5730 Shell Necklace [分治fft | 多项式求逆]

    hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...

  5. 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是第二类斯特林 ...

  6. 分治FFT的三种含义

    分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...

  7. 【XSY2666】排列问题 DP 容斥原理 分治FFT

    题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...

  8. 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp

    题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to ...

  9. prime distance on a tree(点分治+fft)

    最裸的点分治+fft,调了好久,太菜了.... #include<iostream> #include<cstring> #include<cstdio> #inc ...

随机推荐

  1. 题解-bzoj4221 JOI2012kangaroo

    Problem bzoj 题意:给定\(n\)只袋鼠,每只袋鼠有俩属性\(a,b\),若\(a_i\leq b_j\),则\(i\)是可以被\(j\)放置在袋子里的,求经过一系列放置操作后无法进行操作 ...

  2. Python在线聊天软件(Tkinter)

    1.python2.7下安装 apt-get install python-tk 主要功能是实现客户端与服务器端的双向通信,这个小东西用到的主要知识点: 1.Python Socket:2.Pytho ...

  3. 002_运维SOP

    一. <1>SOP:运维工作的标准化 <2>回滚:代码回滚 <3>降级:是利用有限资源,保障系统核心功能高可用.有损的架构方法 <4>多活切换:多机房切 ...

  4. Mysql 数据库增删改查

    数据插入 语法:INSERT INTO Table_name(field1,field2……fieldN) values(value1,vlaue2,…valueN) 单行插入用户类型 INSERT ...

  5. 【原创】大叔经验分享(34)hive中文注释乱码

    在hive中查看表结构时中文注释乱码,分为两种情况,一种是desc $table,一种是show create table $table 1 数据库字符集 检查 mysql> show vari ...

  6. js跳转页面(转)

    <span id="tiao">3</span><a href="javascript:countDown"></a& ...

  7. C3盒子弹性布局

    有效的对一个容器中的子元素进行排列.对齐和分配空白空间. 对浏览器版本要求较高,多用于移动端的响应式设计 flex-direction 顺序指定了弹性子元素在父容器中的位置. flex-directi ...

  8. Confluence 6 CSS 编辑快速入门

    希望编辑空间的 CSS 样式表: 进入空间后,然后从边栏的底部选择 空间工具(Space tools) > 外观和感觉(Look and Feel) . 然后选择 样式表(Stylesheet) ...

  9. Confluence 6 修改默认空间标识图片

    空间标识图片在边栏上的站点目录(Sites Directory)中作为图标进行显示.默认的空间标识图片将会应用到所有的空间中,如果你没有自定义的空间标识被定义的话,请查看 Configure the ...

  10. if __name__ == __'main'__: 判断讲解

    """王思聪作为消费者 要吃热狗生产者 负责做热狗问题:王思聪不清楚对方会生产多少热狗 """from multiprocessing im ...