P4091 [HEOI2016/TJOI2016]求和

题目描述

在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。

现在他想计算这样一个函数的值:

\[f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\times 2^j \times (j!)
\]

\(S(i, j)\)表示第二类斯特林数,递推公式为:

\[S(i, j) = j \times S(i - 1, j) + S(i - 1, j - 1), 1 \le j \le i - 1
\]

边界条件为:

\[S(i, i) = 1(0 \le i), S(i, 0) = 0(1 \le i)
\]

你能帮帮他吗?

输入输出格式

输入格式:

输入只有一个正整数

输出格式:

输出\(f(n)\)。由于结果会很大,输出\(f(n)\)对\(998244353(7 × 17 × 2^{23} + 1)\)取模的结果即可。

说明

对于\(50\%\)数据\(1 ≤ n ≤5000\)

对于\(100\%\)数据\(1 ≤ n ≤ 100000\)


迷迷糊糊的乱推...

\[\begin{aligned}
&\sum_{i=0}^n\sum_{i=0}^i{i\brace j}2^jj!\\
=&\sum_{i=0}^n\sum_{i=0}^n{i\brace j}2^jj!\\
=&\sum_{j=0}^n2^jj!\sum_{i=0}^n{i\brace j}\\
=&\sum_{j=0}^n2^jj!\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!}\\
=&\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k}{k!}\sum_{i=0}^n\frac{(j-k)^i}{(j-k)!}
\end{aligned}
\]

\[A_i=\frac{(-1)^i}{i!},B_i=\sum_{k=0}^n\frac{k^i}{k!}
\]

然后卷一下子就行了。

注意一点,\(B_0=1\),这个要代入原式的定义式得到。


Code:

#include <cstdio>
#include <algorithm>
const int N=(1<<18)+10;
const int mod=998244353,G=3,Gi=332748118;
#define mul(a,b) (1ll*(a)*(b)%mod)
#define add(a,b) ((a+b)%mod)
int n,A[N],B[N],len=1,L=-1,turn[N],ifac[N],fac[N];
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
void NTT(int *a,int typ)
{
for(int i=1;i<len;i++) if(i<turn[i]) std::swap(a[i],a[turn[i]]);
for(int le=1;le<len;le<<=1)
{
int wn=qp(typ?G:Gi,(mod-1)/(le<<1));
for(int p=0;p<len;p+=le<<1)
{
int w=1;
for(int i=p;i<p+le;i++,w=mul(w,wn))
{
int tx=a[i],ty=mul(w,a[i+le]);
a[i]=add(tx,ty);
a[i+le]=add(tx,mod-ty);
}
}
}
if(!typ)
{
int inv=qp(len,mod-2);
for(int i=0;i<len;i++) a[i]=mul(a[i],inv);
}
}
int main()
{
scanf("%d",&n);
while(len<=n<<1) len<<=1,++L;
for(int i=0;i<len;i++) turn[i]=turn[i>>1]>>1|(i&1)<<L;
fac[0]=1;for(int i=1;i<=n;i++) fac[i]=mul(fac[i-1],i);
ifac[n]=qp(fac[n],mod-2);
for(int i=n-1;~i;i--) ifac[i]=mul(ifac[i+1],i+1);
A[0]=1;
for(int i=1;i<=n;i++) A[i]=i&1?mod-ifac[i]:ifac[i];
B[0]=1,B[1]=n+1;
for(int i=2;i<=n;i++) B[i]=mul(qp(i,n+1)-1,mul(qp(i-1,mod-2),ifac[i]));
NTT(A,1),NTT(B,1);
for(int i=0;i<len;i++) A[i]=mul(A[i],B[i]);
NTT(A,0);int ans=0;
for(int i=0;i<=n;i++) ans=add(ans,mul(qp(2,i),mul(fac[i],A[i])));
printf("%d\n",ans);
return 0;
}

2018.12.23

洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告的更多相关文章

  1. 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告

    P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...

  2. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  3. [洛谷P4091][HEOI2016/TJOI2016]求和

    题目大意:给你$n(n\leqslant10^5)$,求:$$\sum\limits_{i=0}^n\sum\limits_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix ...

  4. 洛谷 P2261 [CQOI2007]余数求和 解题报告

    P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...

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

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

  6. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  7. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  8. [HEOI2016/TJOI2016]游戏 解题报告

    [HEOI2016/TJOI2016]游戏 看起来就是个二分图匹配啊 最大化匹配是在最大化边数,那么一条边就代表选中一个坐标内的点 但是每一行不一定只会有一个匹配 于是把点拆开,按照'#'划分一下就好 ...

  9. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

随机推荐

  1. jmeter控制器(一)

    简单控制器: 也就是最简单的控制器,里面没有任何内容的,如下图所示: 当我设置线程为循环10次时,运行简单控制器及下边的注册,设置如下图: 通过查看结果数得知,注册只成功了一次 ,再注册时出现邮箱已存 ...

  2. Java 集合基础知识 List/Set/Map

    一.List Set 区别 List 有序,可重复: Set 无序,不重复: 二.List Set 实现类间区别及原理 Arraylist 底层实现使用Object[],数组查询效率高 扩容机制    ...

  3. 如何判断Map中的key或value是什么类型

    在上班写工具类时,遇到了一个问题,将xml文件的节点都放入map容器中时,map的value也是一个map,导致取map的value时,需要判断这个value的数据类型,用到了一下说的这些知识: 对于 ...

  4. k8s环境搭建--基于kubeadm方法

    环境 master node: 数量 1, 系统 ubuntu 16.04_amd64 worker node: 数量 1, 系统 ubuntu 16.04_amd64 kubernetes 版本: ...

  5. VMware vCenter Converter迁移Linux系统虚拟机

    (一)简介VMware vCenter Converter Standalone,是一种用于将虚拟机和物理机转换为 VMware 虚拟机的可扩展解决方案.此外,还可以在 vCenter Server ...

  6. 微信小程序开发调试技巧

    1.  查看线上小程序console a.  先打开开发小程序console b.  再打开线上小程序,此时可以查看console

  7. 感谢Thunder

    感谢Thunder团队中的每一位成员. 组长王航认真负责,是一个合格优秀的领导者与伙伴,老师布置的任务都会及时分配给每个人,对待每一项任务都认真严谨负责,了解每个成员的优势及强项. 成员李传康.宋雨. ...

  8. 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...

  9. 第二阶段Sprint冲刺会议3

     进展:讨论视频录制的具体功能,查看有关资料,开始着手编写有关代码.

  10. 一个简单的加减乘除自动生成小程序(JAVA)

    在学习软件工程的时候,遇到一个这样的问题,一个程序员的儿子上小学二年级,老师让家长每天出30道加减题目给学生做,由于家长是个程序员,所以呢,他就自己写了个程序实现,我们可爱的老师于是也叫我们写了一个类 ...