2017 3 11 分治FFT
考试一道题的递推式为$$f[i]=\sum_{j=1}^{i} j^k \times (i-1)! \times \frac{f[i-j]}{(i-j)!}$$
这显然是一个卷积的形式,但$f$需要由自己卷过来(我也不知到怎么说),以前只会生成函数的做法,但这题好像做不了(谁教教我怎么做),于是无奈的写了一发暴力,看题解发现是分治FFT.
分治每层用$f[l]-f[mid]$与$a[1]-a[r-l]$做NTT。
这样显然每个$f[l]-f[mid]$对$f[mid+1]-f[r]$的贡献都考虑到了。
因为分治是从1开始的,所以$f[0]$的转移预处理了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
#define N 400005
using namespace std;
int n,k;
const int p = ;
ll poow[N],jie[N],ni[N];
ll pw(ll x,ll y)
{
ll lst=;
while(y)
{
if(y&)lst=lst*x%p;
x=x*x%p;
y>>=;
}
return lst;
}
ll f[N];
int R[N],a[N],b[N];
void NTT(int *a,int n,int f,int L)
{
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int i=;i<n;i<<=)
{
int wn=pw(,((p-)/(i<<)*f+p-)%(p-));
for(int j=;j<n;j+=(i<<))
{
int w=;
for(int k=;k<i;k++,w=1LL*w*wn%p)
{
int x=a[j+k],y=1LL*a[j+k+i]*w%p;
a[j+k]=(x+y)%p;a[j+k+i]=(x-y+p)%p;
}
}
}
if(f==-)
{
int nw=pw(n,p-);
for(int i=;i<n;i++)a[i]=1LL*a[i]*nw%p;
}
return ;
}
void solve(int l,int r)
{
if(l==r)
{
f[l]=f[l]*jie[l-]%p;
return ;
}
int mid=(l+r)>>;
solve(l,mid);int len=r-l+;int m=len<<;
for(int i=;i<len;i++)a[i]=poow[i];
for(int i=l;i<=mid;i++)b[i-l]=f[i]*ni[i]%p;
int L=;for(len=;len<m;len<<=)L++;
for(int i=mid-l+;i<len;i++)b[i]=;
NTT(a,len,,L);NTT(b,len,,L);
for(int i=;i<len;i++)a[i]=1LL*a[i]*b[i]%p;
NTT(a,len,-,L);
for(int i=mid+;i<=r;i++)f[i]=(f[i]+a[i-l])%p;
solve(mid+,r);
}
int main()
{
scanf("%d%d",&n,&k);
jie[]=;ni[]=;
for(int i=;i<=n;i++)jie[i]=(jie[i-]*i)%p;
for(int i=;i<=n;i++)ni[i]=pw(jie[i],p-);
poow[]=;
for(int i=;i<=n;i++)poow[i]=pw(i,k);
for(int i=;i<=n;i++)f[i]=poow[i];
solve(,n);
printf("%lld\n",f[n]);
return ;
}
2017 3 11 分治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)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
- 2017年11月Dyn365/CRM用户社区活动报名
UG是全球最大Dynamics的用户组织,由最终用户自发组织,由行业有经验的专家自愿贡献知识和经验的非营利机构,与会人员本着务实中立的态度,不进行推介产品,服务以及其他营销行为.在美国,微软Dynam ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- 分治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 ...
随机推荐
- ats Linux Bridge内联
Linux可以配置为在桥接模式下运行. 为网桥分配了两个或更多物理接口. 在接口之间共享单个IP地址. 默认情况下,任何到达一个接口的数据包都会立即路由到另一个网桥接口. 需要的Linux包: bri ...
- 【NLP】彻底搞懂BERT
# 好久没更新博客了,有时候随手在本上写写,或者Evernote上记记,零零散散的笔记带来零零散散的记忆o(╥﹏╥)o..还是整理到博客上比较有整体性,也方便查阅~ 自google在2018年10月底 ...
- gzip命令详解
基础命令学习目录首页 好文链接:https://blog.csdn.net/m0_38132420/article/details/78577247 原文链接:http://www.cnblogs.c ...
- Python中collections模块的使用
本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...
- nginx keepalived 高可用方案(转)
转自: https://www.cnblogs.com/leeSmall/p/9356535.html 一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含 ...
- sqlplus远程连接oracle
格式: sqlplus 用户名/密码@192.168.19.189:1521/MYTEST MYTEST 数据库名称
- 如何使用g++编译调用dll的c++代码
本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ...
- Daily Scrum (2015/10/30)
据组员们反映其他组都会有休息时间,所以我和PM讨论把每周5晚上作为日常休息时间,这一天组员们自由阅读.
- golang数据类型转换
int--string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_in ...
- unique STL讲解和模板
unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序. 代码: #include<bits/stdc++.h> using ...