【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. angularJs的工具方法1

    一.angular.bind();   改this指向 <!DOCTYPE HTML> <html ng-app> <head> <meta http-equ ...

  2. BZOJ 1562 变换序列 二分图匹配+字典序

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...

  3. 2016424王启元 Exp6信息搜集与漏洞扫描

    一.原理与实践说明 1.实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...

  4. Js 中的 this

    Js 中 this 的理解   this 是啥 ? this是 JavaScript 语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用; 随着函数使用场合的不同,this ...

  5. 《metasploit渗透测试魔鬼训练营》靶机演练之第五章实战案例KingView 6.53版本CVE-2011-0406漏洞

    在一个笔记本上开两个虚拟机有点卡,而且太麻烦,就把metasploit的目标靶机放在别的机器上了,ip自己配置了一下, 目标主机:192.168.137.254 入侵机:192.168.137.253 ...

  6. HDU 1272小希的迷宫(裸并查集,要判断是否构成环,是否是连通图)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    ...

  7. 两个事务 update同一张表出现的死锁问题 (转载)

    引言 近来做省一级计算机一级考试系统的时候,学生端进行大批量判分的时候,出现了这样的问题(事务(进程 ID 262)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品.请重新运行该事务.): 这 ...

  8. 【腾讯敏捷转型No.8】你爱上手机QQ了么?

    上一篇文章<QQ邮箱如何利用敏捷做到中国第一>,“QQ邮箱之母”马化腾带领QQ邮箱团队,从流量思维向产品思维转变,“QQ邮箱之父”张小龙也是在这个敏捷转型过程中,剔除固有的成见,激发对优秀 ...

  9. IE6下出现横向滚动条问题的解决方案

    当我们在css样式设置为html {overflow-y:auto;}时,在ie7以上版本应用时不会有问题,可是在ie6下就会发现垂直滚动条出现会引起横向滚动条出现.究其原因是在ie6下,当内容过多出 ...

  10. 【Linux】Linux中VIM编辑器的使用

    vim编辑器是我们在Linux中不可或缺的一部分,我们通常会使用它去自定义编辑文本已达到我们的需求,那么vim文本编辑器具体要怎么使用呢.今天跟大家分享一下vim编辑器的使用: vim编辑器模式介绍 ...