[BZOJ4555][TJOI2016&HEOI2016]求和(分治FFT)
4555: [Tjoi2016&Heoi2016]求和
Time Limit: 40 Sec Memory Limit: 128 MB
Submit: 525 Solved: 418
[Submit][Status][Discuss]Description
在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。
现在他想计算这样一个函数的值:S(i, j)表示第二类斯特林数,递推公式为:S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1。边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i)你能帮帮他吗?Input
输入只有一个正整数
Output
输出f(n)。由于结果会很大,输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果即可。1 ≤ n ≤ 100000
Sample Input
3Sample Output
87HINT
Source
容易得到递推式,可以用CDQ分治+FFT
[l,mid]和[mid+1,r]卷起来怎么处理呢?平移数组变成[0,mid-l]和[mid-l+1,r-l+1]卷,次数界设为r-l+1即可。
代码用时:1h 比较顺利,没有低级错误。
实现比较简单,11348ms
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=(<<)+,P=,g=;
int n,rev[N];
ll inv[N],fac[N],facinv[N],f[N],a[N],b[N]; ll ksm(ll a,ll b){
ll ans=;
for (; b; b>>=,a=a*a%P)
if (b & ) ans=ans*a%P;
return ans;
} void DFT(ll a[],int n,int f){
rep(i,,n-) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=; i<n; i<<=){
int wn=ksm(g,(f==) ? (P-)/(i<<) : (P-)-(P-)/(i<<));
for (int p=i<<,j=; j<n; j+=p){
int w=;
for (int k=; k<i; k++,w=1ll*w*wn%P){
int x=a[j+k],y=1ll*w*a[i+j+k]%P;
a[j+k]=(x+y)%P; a[i+j+k]=(x-y+P)%P;
}
}
}
if (f==-){
int inv=ksm(n,P-);
rep(i,,n-) a[i]=1ll*a[i]*inv%P;
}
} void cdq(int l,int r){
if (l==r) return;
int mid=(l+r)>>,lim=r-l+,n=,L=;
cdq(l,mid);
while (n<lim) n<<=,L++;
rep(i,,n-) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
rep(i,,n-) a[i]=b[i]=;
rep(i,l,mid) a[i-l]=f[i];
rep(i,,r-l) b[i]=facinv[i];
DFT(a,n,); DFT(b,n,);
rep(i,,n-) a[i]=a[i]*b[i]%P;
DFT(a,n,-);
rep(i,mid+,r) f[i]=(f[i]+*a[i-l])%P;
cdq(mid+,r);
} int main(){
freopen("bzoj4555.in","r",stdin);
freopen("bzoj4555.out","w",stdout);
scanf("%d",&n); inv[]=; fac[]=facinv[]=;
rep(i,,n){
if (i!=) inv[i]=(P-P/i)*inv[P%i]%P;
fac[i]=fac[i-]*i%P;
facinv[i]=facinv[i-]*inv[i]%P;
}
f[]=; cdq(,n); ll ans=;
rep(i,,n) ans=(ans+f[i]*fac[i]%P)%P;
if (ans<) ans+=P;
printf("%lld\n",ans);
return ;
}
[BZOJ4555][TJOI2016&HEOI2016]求和(分治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是第二类斯特林 ...
- [BZOJ4555 TJOI2016 HEOI2016 求和]
第一篇博客,请大家多多关照.(鞠躬 BZOJ4555 TJOI2016 HEOI2016 求和 题意: 给定一个正整数\(n\)(\(1\leqq n \leqq100000\)),求: \[ ...
- BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆
不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...
- Bzoj4555: [Tjoi2016&Heoi2016]求和
题面 Bzoj Sol 推柿子 因为当\(j>i\)时\(S(i, j)=0\),所以有 \[\sum_{i=0}^{n}\sum_{j=0}^{n}S(i, j)2^j(j!)\] 枚举\(j ...
- BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】
题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...
- 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT
[题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...
- 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是第二类斯特林 ...
- 【BZOJ 4555】 4555: [Tjoi2016&Heoi2016]求和 (NTT)
4555: [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 315 Solved: 252 Des ...
- bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化
[Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 679 Solved: 534[Submit][S ...
随机推荐
- 引用类型 ( 对象定义 )——Object 类型
本文地址:http://www.cnblogs.com/veinyin/p/7607100.html 创建实例 new 操作符后跟构造函数 var people = new Object(); pe ...
- Django之ModelForm(一)
要说ModelForm,那就先说Form吧! 先给出一个Form示例: models.py from django.db import models class UserType(models.Mod ...
- 读书笔记 effective c++ Item 4 确保对象被使用前进行初始化
C++在对象的初始化上是变化无常的,例如看下面的例子: int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: class Point { int x,y; ...
- C# winform或控制台Properties.Settings.Default的使用及存储位置
C# winform或控制台Properties.Settings.Default的使用及存储位置 作者的程序 是MmPS.ClientForm.exe,使用Properties.Settings.D ...
- Cosbench测试 RGW S3 path_style_access=true模式支持
使用Ceph RGW Cosbench 测试时,文档中没有写如何使用 path_style_access 模式的方法. 查看了一下cosbench源码发现已经支持,只是文档没有写. 提交了一个iss ...
- Gitlab部署及汉化操作
一.简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. GitLab拥有与Github类似的功能 ...
- beego学习笔记(4):开发文档阅读(6)
beego的响应流程: 1.监听的端口接收数据,默认是8080端口. 2.用户请求到达8080端口后,开始数据处理流程. 3.初始化CONTEXT对象.判断是否是WEBSOCKET请求,如果是,设置I ...
- DedeCms当前位置导航去掉最后的分隔符>
DedeCms的当前位置导航调用标签{dede:field name=’position’ /},在栏目页里调用的当前位置导航,最后会出现分割符号“>”,如:主页 > DedeCms 模板 ...
- [你必须知道的.NET]第十七回:貌合神离:覆写和重载
本文将介绍以下内容: 什么是覆写,什么是重载 覆写与重载的区别 覆写与重载在多态特性中的应用 1. 引言 覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之 ...
- Ubuntu16.4 zookeeper-3.4.10 单机多实例部署
上传 zookeeper-3.4.10.tar.gz 到服务器 root@temple-:/usr/local/temple/jar# ll total drwxr-xr-x root root 8月 ...
