当前位置: 首页 > news >正文

BZOJ 4555: [Tjoi2016Heoi2016]求和 (NTT + 第二类斯特林数)

题意

给你一个数 \(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;
}

转载于:https://www.cnblogs.com/zjp-shadow/p/8763277.html

相关文章:

  • Intellij IDEA 生成返回值对象快捷键
  • python中@classmethod @staticmethod区别
  • Unity3d和Android之间互相调用
  • 初涉三分法
  • 关于inodes占用100%解决方法
  • 电商系统处理
  • 20154307《网络对抗》Exp4 恶意代码分析
  • Mac下Nginx访问目录,出现403 Forbidden
  • mac 安装 tomcat 配置
  • 聚类算法
  • 20165215 结对编程——四则运算第一周
  • E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。...
  • 01 JS基础
  • geth常用指令
  • 信号是如何在光纤中传播的?
  • [case10]使用RSQL实现端到端的动态查询
  • 【mysql】环境安装、服务启动、密码设置
  • Centos6.8 使用rpm安装mysql5.7
  • const let
  • GraphQL学习过程应该是这样的
  • k8s 面向应用开发者的基础命令
  • Netty源码解析1-Buffer
  • npx命令介绍
  • spark本地环境的搭建到运行第一个spark程序
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 检测对象或数组
  • 简单数学运算程序(不定期更新)
  • 离散点最小(凸)包围边界查找
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我有几个粽子,和一个故事
  • 应用生命周期终极 DevOps 工具包
  • 自制字幕遮挡器
  • kubernetes资源对象--ingress
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​水经微图Web1.5.0版即将上线
  • # .NET Framework中使用命名管道进行进程间通信
  • # include “ “ 和 # include < >两者的区别
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ###项目技术发展史
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (办公)springboot配置aop处理请求.
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (一)80c52学习之旅-起始篇
  • (一)appium-desktop定位元素原理
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 服务 ServiceController
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET框架设计—常被忽视的C#设计技巧
  • /3GB和/USERVA开关
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [2016.7 day.5] T2