题目链接

(lugou) https://www.luogu.org/problem/P4091
(bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4555

题解

终于不是神仙题了啊。。。
首先\(O(n\log n)\)的FFT做法非常明显,直接用容斥展开,这里不再赘述了。发现最后就是要求一个\(\sum^{n}_{k=0}\sum^{n}_{j=k}(-1)^{j-k}{j\choose k}2^j(\sum^{n}_{i=0}k^i)\).
注意容斥的公式在上指标小于下指标时依然成立,此时其给出的值恒为\(0\).

然后去膜了一波大佬的线性做法:
依然是要求那个式子,但是那个式子可以不用卷积算。
我们发现,假设某序列\(A\)的生成函数为\(A(x)=\sum^{n}_{i=0}a_ix^i\), 那么\(\sum^{n}_{j=0}\sum^n_{i=j}a_i{i\choose j}q^{i-j}x^j=\sum^{n}_{j=0}a_j(x+q)^j=A(x+q)\).
所以要求的就相当于令\(A_i=2^i,q=-1\), 那么\(A(x)=\frac{(2x)^{n+1}}{2x-1}, A(x-1)=\frac{(2x-2)^{n+1}}{2x-3}\), 这个东西直接把上面的二项式展开然后除以一次式\(O(n)\)解决。
这样求出了多项式的每一项,再和\(\sum^{n}_{i=0}k^i\)乘起来求和即可。
对于快速幂,可以用线性筛先求出所有质数的\((n+1)\)次幂,然后按积性函数乘起来,假设质数密度是\(O(\frac{1}{\log n})\)那么复杂度就是\(O(\frac{n}{\log n}\times \log n)=O(n)\).

现在思考一个问题: 这个做法先把二项式展开之后的组合数合了起来,又把合起来之后的式子二项式展开了,那么实际上应该相当于啥也没干,凭什么就优化复杂度了呢?
其实是因为,原来的二项式合并有\(n\)项(做了\(n\)次合并),合并完了之后它变成了一个非常好看的等比数列求和的形式,那么可以直接表示成\((n+1)\)次减\(1\)除以\(1\)次\(-1\), 那么再做二项式展开就只要做一次了,于是复杂度成功降了下来!
真神奇。

代码

由于我懒得写线性筛所以用了快速幂复杂度依然是\(O(n\log n)\).
但是线性做法的思想还是非常值得借鉴的。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;inline int read()
{int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x;
}const int N = 1e5+1;
const int P = 998244353;
const llong INV2 = 499122177;
llong fact[N+3],finv[N+3];
int n;llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);}
llong comb(llong x,llong y) {return x<0||y<0||x<y ? 0ll : fact[x]*finv[y]%P*finv[x-y]%P;}llong a[N+3];
llong aa[N+3];
llong b[N+3];int main()
{fact[0] = 1ll; for(int i=1; i<=N; i++) fact[i] = fact[i-1]*i%P;finv[N] = quickpow(fact[N],P-2); for(int i=N-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;scanf("%d",&n);for(int i=0; i<=n+1; i++){a[i] = quickpow(2ll,n+1)*comb(n+1,i);if((n+1-i)&1) {a[i] = P-a[i];}}a[0]--;for(int i=n; i>=0; i--){aa[i] = a[i+1]*INV2%P;a[i] = (a[i]+3ll*aa[i])%P;}b[0] = 1ll; b[1] = n+1;for(int i=2; i<=n; i++){b[i] = (quickpow(i,n+1)-1)*mulinv(i-1)%P;}llong ans = 0ll;for(int i=0; i<=n; i++) {ans = (ans+aa[i]*b[i])%P;}printf("%lld\n",ans);return 0;
}

BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)相关推荐

  1. [HEOI2016/TJOI2016]求和(第二类斯特林数)

    题目 [HEOI2016/TJOI2016]求和 关于斯特林数与反演的更多姿势\(\Longrightarrow\)点这里 做法 \[\begin{aligned}\\ Ans&=\sum\l ...

  2. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 不要见到组合数就拆! 枚举每个点的度数,则答案为 \( n*\sum\limits_{ ...

  3. 【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0 用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O( ...

  4. 洛谷 P4091 [HEOI2016/TJOI2016]求和 任意模数fft

    题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: f(n)=∑ni=0∑ij=0S(i,j)×2j×(j!) f ( n ) = ∑ i = 0 n ...

  5. BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...

  6. 第一类和第二类斯特林数

    第一类斯特林数 第一类斯特林数定义如下: \(s_1(n,k)\)表示\(n\)个元素组成\(k\)个圆排列的方案数. 其中\(n\)个元素的圆排列定义为\(n\)个元素围成一圈的排列,两个圆排列本质 ...

  7. P5395 【模板】第二类斯特林数·行

    P5395 [模板]第二类斯特林数·行 题目描述 Solution 这题是[Tjoi2016&Heoi2016]求和的前置技能啊-- 我似乎直接跳过这题,去做应用了QAQQAQQAQ. Cod ...

  8. 第一类斯特林数 / 第二类斯特林数 / 贝尔数 小结

    第一类斯特林数 有 nnn 个不同的小球,将它们串成 mmm 条项链,有多少种不同的方案? 第一类斯特林数的表示方法为 [nm]\left[\begin{matrix}n\\m\end{matrix} ...

  9. 【组合数学】第一类,第二类斯特林数(Stirling),Bell数

    第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...

最新文章

  1. 在50亿信息泄露事件面前,Struts 2 漏洞和CIA泄密都是小事 | 宅客周刊
  2. 技术部门 Leader 与团队那些事
  3. 转向语句 goto语句
  4. VTK:几何对象之PlanesIntersection
  5. 6-3 逆序数据建立链表
  6. ansible中yaml语法应用
  7. jpa 返回数据转换_如何使用JPA类型转换器加密数据
  8. win7电脑文件夹属性没有安全选项的解决方法
  9. php-fpm的重启
  10. 10万辅导老师困境:上半年被抢,下半年被裁
  11. 大数据_Flink_数据处理_运行时架构5_slot和任务调度---Flink工作笔记0020
  12. XMind软件简易使用教程
  13. 原生android字体,安卓原生字体
  14. 布莱克曼哈尔窗matlab,基于matlab的布莱克曼窗函数法设计的低通滤波器
  15. 计算机硬件调查和报价600字,600字调查报告.docx
  16. 网页自动加拼音html,javascript实现输入中文自动生成拼音
  17. 基于深度学习的动物识别方法研究与实现
  18. 敏感字段加密,叶俊峰
  19. 阿里云无影研发负责人任晋奎:无影核心技术能力突破,打造云网端融合的全新体验
  20. 微信h5页面提交表单后返回键重复提交的问题

热门文章

  1. wdcp后台重启服务器后mysql打不开
  2. python参考手册 豆瓣_python之父亲自撰写两年后豆瓣评分9.8《python深度学习》PDF分享...
  3. VTK修炼之道30:图像重采样_降采样和升采样技术
  4. C#反射技术之一动态读取和设置对象的属性值
  5. libevent中指定使用哪种方法如select
  6. SpringBoot项目优化和Jvm调优及VisualVM远程连接监控JVM(JMX连接)
  7. 白话详细解读(二)-----AlexNet
  8. 操作系统(三十五)连续分配管理方式
  9. STM32开发 -- 4G模块开发详解(4)
  10. S5PV210开发 -- Linux dd命令