【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. PhoneGap模仿微信摇一摇功能

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 【[CQOI2018]解锁屏幕】

    状压这个东西好像没有什么能优化的高级东西,像什么斜率优化,单调队列在状压的优化上都很少见 而最常见的状压优化就是预处理优化了, 这道题就预处理一下所有点对之间连线上的点,之后压成状态就能做到\(O(2 ...

  3. 3.2 Spark内置RPC框架

    实现的HttpFileServer,但在Spark 2.0.0版本中它也被废弃了,现在使用的是基于Spark内置RPC框架的NettyStreamManager.节点间的Shuffle过程和Block ...

  4. random模块 参生随机数

    记得要import random模块 随机整数: >>> import random >>> random.randint(0,99) 21 随机选取0到100间的 ...

  5. git编译安装报错 http-push.c:20:19: 警告:expat.h:没有那个文件或目录

    解决: [root@hdoop3 git-2.18.1]# yum install expat-devel

  6. PAT——1052. 卖个萌

    萌萌哒表情符号通常由“手”.“眼”.“口”三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手] 现给出可选用的符号集合,请你按用户的要求输出 ...

  7. webapi文件上传和下载

    文件上传我们可以做上传文件保存到图片与导入数据,下载可以下载多样的文件. 上传:实例是单个文件导入 NopiHelper:地址 ①简单的上传图片进行保存,方法跟MVC中的一样 <form nam ...

  8. Oracle startup的四个阶段

    shutdown->nomount->mount->open: 1.shutdown:数据库关闭 2.nomount: 1)$ORACLE_HOME/dbs下找初始化参数文件 a.s ...

  9. ios宏定义字符串

    ios宏定义字符串 #define objcString(str) @""#str"" 使用效果: objcString(字符串)

  10. 如何通过github上传项目并在readme.md中展示图片二维码

    将本地项目上传至github   第一步:git init (创建仓库)   第二步:git add README.md (添加项目)git add *   第三步:git commit -m &qu ...