BZOJ 4555

一道模板题。

第二类斯特林数有公式:

$$S(n, m) = \frac{1}{m!}\sum_{i = 0}^{m}(-1)^i\binom{m}{i}(m - i)^n$$

考虑它的组合意义:$S(n, m)$表示$n$个不相同的小球放到$m$个相同的盒子里而且不能有空盒的方案数。

我们枚举空盒有$i$个,然后进行容斥。因为盒子没有区别,所以最后得到的值还要除以$m!$。

本题要求:

$$\sum_{i = 0}^{n}\sum_{j = 0}^{i}S(i, j)*2^j*(j!)$$

$$=\sum_{j = 0}^{n}2^j*(j!)\sum_{i = 0}^{n}S(i, j)$$

$$=\sum_{j = 0}^{n}2^j*(j!)\sum_{i = 0}^{n}\frac{1}{j!}\sum_{k = 0}^{j}(-1)^k\binom{j}{k}(j - k) ^ i$$

$$=\sum_{j = 0}^{n}2^j\sum_{i = 0}^{n}\sum_{k = 0}^{j}(-1)^k\frac{j!}{k!(j - k)!}*(j - k)^i$$

$$=\sum_{j = 0}^{n}2^j*(j!)\sum_{k = 0}^{j}\frac{(-1^k)}{k!} * \frac{\sum_{i = 0}^{n}(j - k)^i}{(j - k)!}$$

记$f(i) = \frac{(-1^k)}{k!}$,$g(i) = \frac{\sum_{j = 0}^{n}i^j}{(i)!}$,

因为$S(0, 0) = (-1)^0 * 1 * 0^0 = 1$,所以记$g(0) = 1$,$g(1) = n + 1$,剩下代入等比数列求和公式。

那么原式化为

$$\sum_{i = 0}^{n}2^i*(i!)(f*g)(i)$$

做一遍$NTT$就好了。

时间复杂度$O(nlogn)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 3e5 + ;
const ll P = 998244353LL; int n, lim = , pos[N];
ll f[N], g[N], fac[N], inv[N], bin[N]; template <typename T>
inline void swap(T &x, T &y) {
T t = x; x = y; y = t;
} template <typename T>
inline void inc(T &x, T y) {
x += y;
if(x >= P) x -= P;
} inline ll fpow(ll x, ll y) {
ll res = 1LL;
for (; y > ; y >>= ) {
if (y & ) res = res * x % P;
x = x * x % P;
}
return res;
} inline void prework() {
int l = ;
for (; lim <= n * ; ++l, lim <<= );
for (int i = ; i < lim; i++)
pos[i] = (pos[i >> ] >> ) | ((i & ) << (l - ));
} inline void ntt(ll *c, int opt) {
for (int i = ; i < lim; i++)
if (i < pos[i]) swap(c[i], c[pos[i]]);
for (int i = ; i < lim; i <<= ) {
ll wn = fpow(, (P - ) / (i << ));
if(opt == -) wn = fpow(wn, P - );
for (int len = i << , j = ; j < lim; j += len) {
ll w = 1LL;
for (int k = ; k < i; k++, w = w * wn % P) {
ll x = c[j + k], y = w * c[j + k + i] % P;
c[j + k] = (x + y) % P, c[j + k + i] = (x - y + P) % P;
}
}
} if (opt == -) {
ll invP = fpow(lim, P - );
for (int i = ; i < lim; i++)
c[i] = c[i] * invP % P;
}
} int main() {
scanf("%d", &n); bin[] = fac[] = 1LL;
for (int i = ; i <= n; i++) {
fac[i] = fac[i - ] * i % P;
bin[i] = bin[i - ] * 2LL % P;
}
inv[n] = fpow(fac[n], P - );
for (int i = n - ; i >= ; i--) inv[i] = inv[i + ] * (i + ) % P; /* for (int i = 0; i <= n; i++)
printf("%lld%c", inv[i] * fac[i] % P, i == n ? '\n' : ' '); */ for (int i = ; i <= n; i++) {
f[i] = ((i & ) ? (-1LL) : (1LL)) * inv[i] % P;
if(f[i] < ) f[i] += P;
if(i == ) g[i] = 1LL;
else if (i == ) g[i] = n + ;
else g[i] = (fpow(i, n + ) - + P) % P * fpow(i - , P - ) % P;
g[i] = g[i] * inv[i] % P;
} prework();
ntt(f, ), ntt(g, );
for (int i = ; i < lim; i++) f[i] = f[i] * g[i] % P;
ntt(f, -); ll ans = 0LL;
for (int i = ; i <= n; i++)
inc(ans, bin[i] * fac[i] % P * f[i] % P); printf("%lld\n", ans);
return ;
}

Luogu 4091 [HEOI2016/TJOI2016]求和的更多相关文章

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

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

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

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

  3. 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^ ...

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

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

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

    [LG4091][HEOI2016/TJOI2016]求和 题面 要你求: \[ \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j! \] 其中\(S\)表示第二类斯特林数,\ ...

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

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

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

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

  8. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

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

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

随机推荐

  1. 【操作系统】总结五(I/O管理)

    输入输出管理本章主要内容: I/O管理概述(I/O控制方式.I/O软件层次结构)和I/O核心子系统(I/O调度概念.局速缓存与缓冲区.设备分配与回收.假脱机技术(SPOOLing)). 5.1 I/O ...

  2. 在django中使用logging

    转:http://www.tuicool.com/articles/IV3meeE logging django使用python的内置模块logging来管理自己的日志,logging中四个重要的概念 ...

  3. 前端mvc mvp mvvm 架构介绍(vue重构项目一)

    首先 我们为什么重构这个项目 1:我们现有的技术是前后台不分离,页面上采用esayUI+jq构成的单页面,每个所谓的单页面都是从后台胜场的唯一Id 与前端绑定,即使你找到了那个页面元素,也找不到所在的 ...

  4. jquery中ajax异步调用接口

    之前写过一个原始的.无封装的页面,没有引入任何外部js,直接实例化Ajax的XmlRequest对象去异步调用接口,参见Ajax异步调用http接口后刷新页面,可对比一下. 现在我们用jquery包装 ...

  5. ansible命令应用示例

                                  ansible命令应用示例                             ping slave组 ansible slave -m ...

  6. 【转】使用JMeter 完成常用的压力测试(一)

    本文介绍了 JMeter 相关的基本概念.并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试, ...

  7. android欢迎页

    在进入程序后,会在一个页面停留几秒然后自动跳转到程序主界面,这个页面就是欢迎页. 首先新建个java文件,给他起名叫做WelcomeActivity 在里面我们通过一个匿名类new Handler,在 ...

  8. ARM-Linux内核移植之(一)——内核启动流程分析

    内核版本:2.6.22  为什么要采用这样一个较低的版本进行移植了,因为韦东山大牛说了,低版本的才能学到东西,越是高版本需要移植时做的工作量越少,学的东西越少. 内核启动分为三个阶段,第一是运行hea ...

  9. Android:通过滤镜实现点击图片变暗效果

    实现点击图片(ImageView)变暗效果,有一个较简单的方法,就是讲目标图片设置为背景图片(setBackground),再创建一个selector.xml文件,里面放置一张普通状态时的透明图片,一 ...

  10. a标签的四个伪类是什么?如何排序?为什么?

    爱恨分明原则: l v h a 注释:为了产生预期的效果,在 CSS 定义中,a:hover 必须位于 a:link 和 a:visited 之后 ! 注释:为了产生预期的效果,在 CSS 定义中,a ...