【BZOJ4555】[TJOI&HEOI2016]求和 斯特林数+NTT
Description
在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。
现在他想计算这样一个函数的值:
.png)
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
3
Sample Output
87
Sol
本题递推公式没用,因为我们需要在\(nlogn\)时间内求出这个结果。
首先我们根据第二类斯特林数的定义“把i个数字分到j的相同集合的方案数”,得:
\(s(i,j)=\frac{1}{j!}*\sum_{k=0}^{j}(-1)^kC^k_j(j-k)^i\)
意义就是我们假设至少k个集合为空,然后用组合数算出选择空集的方案数,之后剩下\(j-k\)个集合,i个数字,那么方案数就是\((j-k)^i\)。但是这样不保证剩下的严格非空,所以要容斥一波。然后因为上述是有序的,而第二类斯特林数是无序的,所以要除以阶乘。
之后我们把组合数拆开,得到:
\(s(i,j)=\sum_{k=0}^{j}\frac{(-1)^k}{k!}*\frac{(j-k)^i}{(j-k)!}\)
带入所求的式子中,得到:
\(f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}\sum_{k=0}^{j}\frac{(-1)^k}{k!}*\frac{(j-k)^i}{(j-k)!}\)
因为\(j>i\)的时候右面不会产生贡献,所以我们可以把j的范围写到n:
\(f(n)=\sum_{i=0}^{n}\sum_{j=0}^{n}j!2^j\sum_{k=0}^{j}\frac{(-1)^k}{k!}*\frac{(j-k)^i}{(j-k)!}\)
尽管是卷积,但是还是得\(O(n^2logn)\),但是i只用到了一处,所以我们更换循环顺序,得:
\(f(i)=\sum_{j=0}^{n}j!2^j\sum_{k=0}^{j}\frac{(-1)^k}{k!}*\frac{\sum_{i=0}^{n}(j-k)^i}{(j-k)!}\)
那个带\(\sum\)的是个等比数列,可以\(O(1)\)计算,然后就是\(NTT\)啦。
时间复杂度\(O(nlogn)\)。
Code
#include <cstdio>
int i,j,k,I[100005],IF[100005],a[262145],b[262145],F[262145],B[100005],P=998244353,w,wn,t,n,len,ans;
int ksm(int a,int b){int res=1;for(;b;b>>=1,a=1ll*a*a%P) if(b&1) res=1ll*res*a%P;return res;}
void ntt(int *a,int n,int op)
{
for(i=k=0;i<n;i++){if(i>k) a[i]^=a[k]^=a[i]^=a[k];for(j=(n>>1);(k^=j)<j;j>>=1);}
for(k=2,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k);k<=n;k<<=1,wn=ksm(3,op==1?(P-1)/k:P-1-(P-1)/k))
for(i=0,w=1;i<n;i+=k,w=1) for(j=0;j<(k>>1);j++,w=1ll*w*wn%P)
t=1ll*a[i+j+(k>>1)]*w%P,a[i+j+(k>>1)]=(a[i+j]-t+P)%P,a[i+j]=(a[i+j]+t)%P;
if(op==-1) for(t=ksm(n,P-2),i=0;i<n;i++) a[i]=1ll*a[i]*t%P;
}
int main()
{
scanf("%d",&n);for(len=1;len<=n*2;len<<=1);
F[0]=B[0]=I[1]=F[1]=1,B[1]=2;for(int i=2;i<=n;i++) F[i]=1ll*F[i-1]*i%P,B[i]=1ll*B[i-1]*2%P,I[i]=1ll*I[P%i]*(P-P/i)%P;
IF[n]=ksm(F[n],P-2);for(int i=n-1;~i;i--) IF[i]=1ll*IF[i+1]*(i+1)%P;
a[0]=b[0]=1;for(int i=1;i<=n;i++) b[i]=(((i&1)?-1:1)*IF[i]+P)%P,a[i]=(i==1)?n+1:1ll*IF[i]*(ksm(i,n+1)-1)%P*I[i-1]%P;
ntt(a,len,1);ntt(b,len,1);
for(int i=0;i<len;i++) a[i]=1ll*a[i]*b[i]%P;ntt(a,len,-1);
for(int i=0;i<=n;i++) ans=(ans+1ll*B[i]*F[i]%P*a[i]%P)%P;
printf("%d\n",ans);
}
【BZOJ4555】[TJOI&HEOI2016]求和 斯特林数+NTT的更多相关文章
- [HEOI2016/TJOI2016][bzoj4555] 求和 [斯特林数+NTT]
题面 传送门 思路 首先,我们发现这个式子中大部分的项都和$j$有关(尤其是后面的$2^j\ast j!$),所以我们更换一下枚举方式,把这道题的枚举方式变成先$j$再$i$ $f(n)=\sum_{ ...
- 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT
[题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...
- [BZOJ4555 TJOI2016 HEOI2016 求和]
第一篇博客,请大家多多关照.(鞠躬 BZOJ4555 TJOI2016 HEOI2016 求和 题意: 给定一个正整数\(n\)(\(1\leqq n \leqq100000\)),求: \[ ...
- BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】
题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...
- 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)
Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...
- bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...
- P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)
传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...
- BZOJ 4555:[TJOI2016&HEOI2016]求和(第二类斯特林数+NTT)
题目链接 \(Description\) 求 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj!\]对998244353取模后的结果. \(n<=10^5\) \(Sol ...
- P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】
正题 题目链接:https://www.luogu.com.cn/problem/P4091 题目大意 给出\(n\),求 \[\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatr ...
随机推荐
- IDEA实用的第三方插件和工具介绍设置
一:grep console grep-console插件可以让idea显示多颜色调试日志,使Log4j配置输出的不同级别error warn info debug fatal显示不同颜色 开发起来区 ...
- 简单的方法实现仿微信底部的Tab选项卡界面
在网上看了比较多的关于Tab的教程,发现都很杂乱.比较多的用法是用TitlePagerTabStrip和ViewPaper.不过TitlePagerTabStrip有个很大的缺陷,Tab里面的内容刚进 ...
- Hibenate错误汇总:java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger
转自:https://bioubiou.iteye.com/blog/1769950 1 Hibenate异常汇总:java.lang.NoClassDefFoundError: org/jboss/ ...
- Oracle11gR2--删除数据库
1. 停止ORACLE数据库 [oracle@localhost oracle]$ ps -ef|grep smon oracle 72550 1 0 14:23 ? 00:00:00 ora_smo ...
- mac下怎样删除冗余的环境变量?echo $PATH
记下$PATH变量中冗余路径所处顺序,例如: /Users/zhang/.rvm/gems/ruby-2.1.2/bin:/Users/zhang/.rvm/gems/ruby-2.1.2@globa ...
- Python学习笔记_一个Tkinter示例,使用FileDialog
为了使用Python进行数据分析,编写一个图形界面,选择一个Excel文件(或CSV),然后进行后续处理. 一.本示例涵盖如下知识点: 1.FileDialog的使用 2.退出程序 3.消息提示框的示 ...
- BOOL运算符号(从C#入门经典第五版中摘录)
只总结自己觉得难的哈: (1) var1=!var2; //(非) (2) var1=var2&var3; //(与) (3)var1=var2|var3; //(或) (4 ...
- c# 多维数组、交错数组(转化为DataTable)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Part4_lesson3---U-Boot工作流程分析
1.程序入口 我们从什么地方去找入口呢,首先是打开顶层目录的makefile文件,在这个文件里面,每一个uboot支持的开发板都有一个配置选项,比如说,搜索smdk2440,结果如下 我们主要关注上图 ...
- Requests接口测试(五)
使用python+requests编写接口测试用例 好了,有了前几章的的基础,写下来我把前面的基础整合一下,来一个实际的接口测试练习吧. 接口测试流程 1.拿到接口的URL地址 2.查看接口是用什么方 ...