题目链接

(luogu) 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. [HEOI2016/TJOI2016]求和——第二类斯特林数

    给你斯特林数就换成通项公式,给你k次方就换成斯特林数 考虑换成通项公式之后,组合数没有什么好的处理方法 直接拆开,消一消阶乘 然后就发现了(j-k)和k! 往NTT方向靠拢 然后大功告成 其实只要想到 ...

  3. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT

    题目大意 求\(f(n)=\sum_{i=0}^n\sum_{j=0}^i2^j\times j!\times S(i,j)\\\) 对\(998244353\)取模 \(n\leq 100000\) ...

  4. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  5. BZOJ 4555:[TJOI2016&HEOI2016]求和(第二类斯特林数+NTT)

    题目链接 \(Description\) 求 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj!\]对998244353取模后的结果. \(n<=10^5\) \(Sol ...

  6. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  7. BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)

    传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...

  8. 【题解】Luogu P4091 [HEOI2016/TJOI2016]求和

    原题传送门 \[\begin{aligned} a n s &=\sum_{i=0}^{n} \sum_{j=0}^{i}\left\{\begin{array}{c}{i} \\ {j}\e ...

  9. luogu P4091 [HEOI2016/TJOI2016]求和

    传送门 这一类题都要考虑推式子 首先,原式为\[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)*2^j*j!\] 可以看成\[f(n)=\sum_{j=0}^{n}2^ ...

随机推荐

  1. # 深圳杯D题爬取电视收视率排行榜

    目录 深圳杯D题爬取电视收视率排行榜 站点分析 代码实现 深圳杯D题爬取电视收视率排行榜 站点分析 http://www.tvtv.hk/archives/category/tv 每天的排行版通过静态 ...

  2. layui自定义插件citySelect 省市区三级联动选择

    省市区三级菜单联动插件 citySelect.js /** * @ name : citySelect 省市区三级选择模块 * @ Author: aggerChen * @ version: 1.0 ...

  3. Codeforces 1221C. Perfect Team

    传送门 考虑如何保证限制,首先团队数最大就是 $min(c,m)$ 但是还不够,每个团队还要 $3$ 个人,所以还要和 $(c+m+x)/3$ 再取 $min$ 这样就满足所有限制了 #include ...

  4. Java 子类继承父类成员中的问题

    之前搞错了,变量没有“重写”一说,只有方法才能被“重写”.如果我们在子类中声明了一个和父类中一样的变量,那么实际的情况是,子类的内存堆中会有类型和名字都相同的两个变量. 现在考虑一种情况,如下所示,我 ...

  5. 配置maven的国内镜像

    pom.xml文件出现错误标记,一般是相关的maven资源没有下载完整. 1,配置maven的国内镜像,保证能够顺利下载maven中配置的资源. 在maven的配置文件  settings.xml  ...

  6. appium 自动化测试框架详读(一)

    appium框架使用的过程记录,开始使用markdown来语法来编写,不知道博客园是否会支持markdown语法 ***1. appium原理* appium启动时,创建一个http://127.0. ...

  7. selenium入门学习

    在写爬虫的学习过程中,经常会有一些动态加载,有些是可以动过接口直接获取到,但是实在没办法,所以学习下selenium. 首先百度一下: Selenium [1]  是一个用于Web应用程序测试的工具. ...

  8. 线程池ThreadPool

    在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在 ...

  9. monkey自定义脚本

    自定义脚本稳定性测试 常规的monkey是执行随机的事件流,如果想让monkey测试某个特定的场景,这个时候需要自定义脚本. 用户需要先笔记好脚本再存放在手机上,通过启动monkey -f参数调用脚本 ...

  10. 第五章Java

    2 [单选题] 已知MyInterface是一个接口,ClassA是实现该接口的一个类,ClassB是ClassA的子类,则下面说法哪个正确?   A. ClassB obj = new ClassA ...