【LG4091】[HEOI2016/TJOI2016]求和

题面

要你求:

\[\sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j!
\]

其中\(S\)表示第二类斯特林数,\(n\leq10^5\),答案对\(998244353\)取模。

题解

这题你们好早就做了,因为由于技术原因(不会\(NTT\)),我现在才做,我真是菜爆了。

先来推柿子:

\(\because S(i,j)=0(i < j)\)

\(\therefore\;\)原式\(=\sum_{i=0}^n\sum_{j=0}^nS_i^j*2^j*j!\)

将\(2^j*j!\)提到前面:

\[\sum_{j=0}^n2^j*(j!)\sum_{i=0}^nS_i^j
\]

\(\because\;S_n^m=\frac {1}{m!}(-1)^iC_m^i(m-i)^n\)

\(\therefore S_n^m=\sum_{i=0}^m\frac {(-1)^i}{i!}\frac {(m-i)^n}{(m-i)!}\)

那么原式\(=\)

\[\sum_{j=0}^n2^j*j!\sum_{i=0}^n\sum_{k=0}^j\frac {(-1)^k}{k!}\frac {(j-k)^i}{(j-k)!}\\
\Leftrightarrow \sum_{j=0}^n2^j*j!\sum_{k=0}^j\frac {(-1)^k}{k!}\frac {\sum_{i=0}^n(j-k)^i}{(j-k)!}\\
\]

然后发现其实后面那一坨是

\[f(i)=\frac {(-1)^i}{i!}\\
g(i)=\frac {\sum_{j=0}^ni^j}{i!}=\frac {i^{n+1}-1}{(i-1)i!}
\]

的卷积,直接\(NTT\)搞就好了。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int Mod = 998244353;
int fpow(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = 1ll * res * x % Mod;
x = 1ll * x * x % Mod;
y >>= 1;
}
return res;
}
const int G = 3, iG = fpow(G, Mod - 2);
const int MAX_N = 3e5 + 5;
int Limit, rev[MAX_N];
void NTT(int *p, int op) {
for (int i = 0; i < Limit; i++) if (i < rev[i]) swap(p[i], p[rev[i]]);
for (int i = 1; i < Limit; i <<= 1) {
int rot = fpow(op == 1 ? G : iG, (Mod - 1) / (i << 1));
for (int j = 0; j < Limit; j += (i << 1)) {
int w = 1;
for (int k = 0; k < i; k++, w = 1ll * w * rot % Mod) {
int x = p[j + k], y = 1ll * w * p[i + k + j] % Mod;
p[j + k] = (x + y) % Mod, p[i + j + k] = (x - y + Mod) % Mod;
}
}
}
if (op == -1) {
int inv = fpow(Limit, Mod - 2);
for (int i = 0; i < Limit; i++) p[i] = 1ll * p[i] * inv % Mod;
}
}
int N, f[MAX_N], g[MAX_N];
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
cin >> N; f[0] = 1, g[0] = 1;
for (int i = 1, fac = 1; i <= N; fac = 1ll * fac * (++i) % Mod) {
f[i] = (1ll * ((i & 1) ? -1 : 1) * fpow(fac, Mod - 2) % Mod + Mod) % Mod;
g[i] = 1ll * (fpow(i, N + 1) + Mod - 1) % Mod * fpow(1ll * (i - 1) * fac % Mod, Mod - 2) % Mod;
}
g[1] = N + 1;
int p = 0;
for (Limit = 1; Limit <= (N << 1); Limit <<= 1, ++p) ;
for (int i = 0; i < Limit; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (p - 1));
NTT(f, 1), NTT(g, 1);
for (int i = 0; i < Limit; i++) f[i] = 1ll * f[i] * g[i] % Mod;
NTT(f, -1);
int ans = 0, fac = 1, pw = 1;
for (int i = 0; i <= N; i++, fac = 1ll * fac * i % Mod, pw = 2ll * pw % Mod)
ans = (ans + 1ll * fac * pw % Mod * f[i] % Mod) % Mod;
printf("%d\n", ans);
return 0;
}

【LG4091】[HEOI2016/TJOI2016]求和的更多相关文章

  1. 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告

    P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...

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

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

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

    [题解]P4091 [HEOI2016/TJOI2016]求和 [P4091 HEOI2016/TJOI2016]求和 可以知道\(i,j\)从\(0\)开始是可以的,因为这个时候等于\(0\).这种 ...

  4. LG4091 【[HEOI2016/TJOI2016]求和】

    前置:第二类斯特林数 表示把\(n\)个小球放入\(m\)个不可区分的盒子的方案数 使用容斥原理分析,假设盒子可区分枚举至少有几个盒子为空,得到通项: \[S(n,m)=\frac{1}{m!}\su ...

  5. Luogu 4091 [HEOI2016/TJOI2016]求和

    BZOJ 4555 一道模板题. 第二类斯特林数有公式: $$S(n, m) = \frac{1}{m!}\sum_{i = 0}^{m}(-1)^i\binom{m}{i}(m - i)^n$$ 考 ...

  6. 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! ...

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

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

  8. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (luogu) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  9. [题解] LuoguP4091 [HEOI2016/TJOI2016]求和

    传送门 首先我们来看一下怎么求\(S(m,n)\). 注意到第二类斯特林数的组合意义就是将\(m\)个不同的物品放到\(n\)个没有区别的盒子里,不允许有空盒子的方案数. 那么将\(m\)个不同的物品 ...

随机推荐

  1. js实现简单的评论和回复功能(数组版)

    var method={ getDate:function (a,b){ //获取当前日期 //a表示年月日直接的分隔符,b表示时分秒之间的分隔符 var dateStr="", ...

  2. python中基于descriptor的一些概念(下)

    @python中基于descriptor的一些概念(下) 3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3 ...

  3. Spring4 SpringMVC Hibernate4 Freemaker 整合样例

    更正改动(2014-05-30 13:47:22):有的IDE中web.xml会报这个错: cvc-complex-type.2.4.a: Invalid content was found star ...

  4. Guava包学习-Multimap

    它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同v ...

  5. apache2 重启、停止、优雅重启、优雅停止

    停止或者重新启动Apache有两种发送信号的方法 第一种方法: 直接使用linux的kill命令向运行中的进程发送信号.你也许你会注意到你的系统里运行着很多httpd进程.但你不应该直接对它们中的任何 ...

  6. ZooKeeper学习之路 (五)ZooKeeper API的简单使用 增删改查

    zookeeper文件系统的增删改查 public class ZKDemo1 { private static final String CONNECT_STRING = "hadoop1 ...

  7. 安装Centos 7 错误解决

    dracut-initqueue[624]:Warning: Could not boot. dracut-initqueue[624]:Warning: /dev/root does not exi ...

  8. select和epoll

    C/S编程模型,对每一个客户端都要开辟一个新的线程,效率必定低下.普通select模型是开辟两个线程,一个用来监听客户端的连接,另一个用于处理客户端请求. fd_set set; FD_ZERO(&a ...

  9. sharepoint 搜索报错

    配置sharepoint 拓扑架构,将两台服务器一起来爬网. 配置如下: $hostA = Get-SPEnterpriseSearchServiceInstance -Identity " ...

  10. iOS开发UI篇 -- UISearchBar 属性、方法详解及应用(自定义搜索框样式)

    很多APP都会涉及到搜索框,苹果也为我们提供了默认的搜索框UISearchBar.但实际项目中我们通常需要更改系统默认搜索框的样式.为了实现这一目标,我们需要先搞懂 UISearchBar 的属性及方 ...