题意

给你一个数 \(n\) 求这样一个函数的值 :

\[\displaystyle f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i} {i \brace j} 2^j j!
\]

\((1 \le n \le 100000)\)

题解

这个题直接划式子 然后 \(NTT\) 就行了qwq

需要知道一个容斥求斯特林数的东西

\[\displaystyle \begin{Bmatrix} n \\ m \end{Bmatrix} = \frac{1}{m!} \sum_{k=0}^m (-1)^k (m-k)^n
\]

这个用组合意义去理解 我们考虑把 \(n\) 个物品放进 \(m\) 个盒子里中的方案数就是斯特林数(盒子不区分)

然后我们考虑枚举至少有 \(k\) 个空的盒子的方案数 那么 \(n\) 就可以随便放入剩下的 \((m-k)\) 个盒子中去

这个式子我们划一下 就可以得到一个用来 \(NTT\) 的式子...

拆一下组合数....

\[\displaystyle \begin{Bmatrix} n \\ m \end{Bmatrix} = \frac{1}{m!} \sum _{k=0}^{m} (-1)^k \frac{m!}{k!(m-k)!}(m-k)^n
\]

然后再简单整理一下qwq

\[\displaystyle \begin{Bmatrix} n \\ m \end{Bmatrix} = \sum_{k=0}^{m} [\frac{(-1)^k}{k!}][\frac{(m-k)^n}{(m-k)!}]
\]

然后这个就是 \(NTT\) 的式子了

对于这道题我们也可以这样做qwq

\[\displaystyle f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i} \begin{Bmatrix} i \\ j \end{Bmatrix} \times 2^j \times (j!)
\]

如果 \(j > i\) 时 \(\begin{Bmatrix} i \\ j \end{Bmatrix}\) 是为 \(0\) 的 (没有方案数) 那么就有

\[\displaystyle =\sum_{i=0}^{n}\sum_{j=0}^{n} \begin{Bmatrix} i \\ j \end{Bmatrix} \times 2^j \times (j!)
\]

把之前的那个套进来 卷积形式 我们可以将 \(j-k\) 与 \(k\) 互换

\[\displaystyle =\sum_{i=0}^{n}\sum_{j=0}^{n} 2^j \times (j!) \sum_{k=0}^{j}[\frac{(-1)^{j-k}}{(j-k)!}][\frac{k^i}{k!}]
\]

不难发现只有一个地方与 \(i\) 有关 那么我们再放进去

\[\displaystyle =\sum_{j=0}^{n} 2^j \times (j!) \sum_{k=0}^{j}[\frac{(-1)^{j-k}}{(j-k)!}][\frac{\sum_{i=0}^{n}k^i}{k!}]
\]

然后那个是等比数列 我们用等比数列求和公式 就可以直接处理出来了

\[\displaystyle =\sum_{j=0}^{n} 2^j \times (j!) \sum_{k=0}^{j}[\frac{(-1)^{j-k}}{(j-k)!}][\frac{k^{n+1}-1}{(k-1)k!}]
\]

右边卷积就可以求出对于每个 \(j\) 的取值咯qwq

注意程序中卷积之前 要特判右边等比数列次数 \(=0,1\) 的答案 一个是 \(1\) 另一个是 \(n+1\)

代码

#include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std; inline bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
inline bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * fh;
} void File() {
#ifdef zjp_shadow
freopen ("4555.in", "r", stdin);
freopen ("4555.out", "w", stdout);
#endif
} typedef long long ll;
const ll Mod = 998244353; ll fpm(ll x, int power) {
ll res = 1;
for (; power; power >>= 1, (x *= x) %= Mod)
if (power & 1) (res *= x) %= Mod;
return res;
} const int N = 1 << 19;
struct Number_Theoretic_Transform {
ll pow3[N], invpow3[N], a[N], b[N];
int n, m, rev[N]; void Init(int n1, int n2, ll A[], ll B[]) {
For (i, 0, n1) a[i] = A[i];
For (i, 0, n2) b[i] = B[i];
m = n1 + n2;
} void NTT(ll P[], int opt) {
For (i, 0, n - 1) if (i < rev[i]) swap(P[i], P[rev[i]]);
for (int i = 2, p; i <= n; i <<= 1) {
p = (i >> 1);
ll Wi = (opt == 1) ? pow3[i] : invpow3[i];
for (int j = 0; j < n; j += i) {
ll x = 1;
for (int k = 0; k < p; ++ k, (x *= Wi) %= Mod) {
ll u = P[j + k], v = x * P[j + k + p] % Mod;
P[j + k] = (u + v) % Mod;
P[j + k + p] = (u - v + Mod) % Mod;
}
}
}
if (opt == -1) {
ll invn = fpm(n, Mod - 2);
For (i, 0, n - 1) (P[i] *= invn) %= Mod;
}
} void Mult() {
int cnt = 0; for (n = 1; n <= m; n <<= 1) ++ cnt;
for (int i = 1; i <= n; i <<= 1)
pow3[i] = fpm(3, (Mod - 1) / i), invpow3[i] = fpm(pow3[i], Mod - 2);
For (i, 1, n) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (cnt - 1));
NTT(a, 1); NTT(b, 1);
For (i, 0, n - 1) (a[i] *= b[i]) %= Mod;
NTT(a, -1);
}
} T; int n;
ll a[N], b[N], fac[N], ifac[N]; void Init(int maxn) {
fac[0] = ifac[0] = 1;
For (i, 1, maxn) fac[i] = fac[i - 1] * i % Mod;
ifac[maxn] = fpm(fac[maxn], Mod - 2);
Fordown (i, maxn - 1, 1) ifac[i] = ifac[i + 1] * (i + 1) % Mod;
} ll ans = 0;
int main () {
File(); n = read(); Init(n);
For (i, 0, n) {
a[i] = (Mod + ((i & 1) ? -1 : 1) * ifac[i]) % Mod;
if (i > 1) b[i] = (fpm(i, n + 1) - 1) * ifac[i] % Mod * fpm(i - 1, Mod - 2) % Mod;
else if (i == 1) b[i] = n + 1;
else if (i == 0) b[i] = 1;
// printf ("a[%d] = %lld; b[%d] = %lld;\n", i, a[i], i, b[i]);
}
T.Init(n, n, a, b);
T.Mult();
For (i, 0, n)
(ans += T.a[i] * fpm(2, i) % Mod * fac[i]) %= Mod;
printf ("%lld\n", ans);
return 0;
}

BZOJ 4555: [Tjoi2016&Heoi2016]求和 (NTT + 第二类斯特林数)的更多相关文章

  1. bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化

    [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 679  Solved: 534[Submit][S ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 第二类斯特林数展开式: \( S(i,j) = \frac{1}{j!} \sum\l ...

  3. BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】

    题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...

  4. 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)

    [BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...

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

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

  6. 【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n ...

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

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

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

  9. 【bzoj4555】[Tjoi2016&Heoi2016]求和(NTT+第二类斯特林数)

    传送门 题意: 求 \[ f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix} i \\ j \end{Bmatrix}2^jj! \] 思路: 直接将第二类斯特林 ...

随机推荐

  1. React-使用react-redux

    react-redux可以方便在react中使用redux,我们就可以忘记subscribe,只需要记住reducer,action和dispatch就可以了.react-redux提供Provide ...

  2. C# 读取Json配置文件

    今天需要用到读取Json配置文件的helper   结果竟然没找到合适的    微软自己有一个 不过不支持.Net fw 4.0 于是自己在NewTonSoft.Json的基础上  加了点小小的封装  ...

  3. SC1243sensor噪点问题调试

    接手一块SC1243sensor的板子调试,仔细核对了原理图和PCB发现,PCB不是很好,电源处理不够好,但是出图了,问题是有噪点,麻点,根据经验要求软件修改了PCLK的极性噪点消失,问题解决. 1: ...

  4. 硬编码转换单位||vue

    //测试单位 formatUnit:function (id) { var val; switch(id){ case 4: return val="圈" break; } } / ...

  5. Java开发23种设计模式之禅

    六大原则 23种设计模式: 总体来说设计模式分为三大类: *创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. *结构型模式,共七种:适配器模式.装饰器模式.代理模式.外 ...

  6. 矩形A + B HDU2524

    题意 给你n*m的棋盘问有多少个矩形 分析 先看只有一行或一列的情况有1+2+....+n个,因为矩形的类型有1个最小单位格子n个,2个最小单位格子n-1个,n个最小单位格子有一个 code #inc ...

  7. 关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

    前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调 ...

  8. 个人阅读作业LAST

    其实从最刚开始到最后,我们团队的任务一直都比较紧,前期主要是因为我们是从零开始的自选题目,一开始大家都有许多不曾用过的技术需要学习,PM安排任务时也不好分配,不过大家也都坚持下来尽量按时完成任务,第一 ...

  9. 《Metasploit渗透测试魔鬼训练营》第一章读书笔记

    第1章 魔鬼训练营--初识Metasploit 20135301 1.1 什么是渗透测试 1.1.1 渗透测试的起源与定义 如果大家对军事感兴趣,会知道各国军队每年都会组织一些军事演习来锻炼军队的攻防 ...

  10. Linux实践四:ELF文件格式分析

    一.分析ELF文件头 二.通过文件头找到section header table,理解内容 三.通过section header table 找到各section 四.理解常见.text .strta ...