传送门

解题思路

数学题,推式子。求\(f(n)=\sum\limits_{i=0}^n\sum\limits_{j=0}^iS(i,j)2^jj!\)

首先可以把\(j\)往前提:

\[f(n)=\sum\limits_{j=0}^n2^jj!\sum\limits_{i=0}^nS(i,j)
\]

然后把斯特林数按照通项展开:

\[f(n)=\sum\limits_{j=0}^n2^jj!\sum\limits_{i=0}^n\tfrac{1}{m!}\sum\limits_{k=0}^j(-1)^kC(j,k)(j-k)^i
\]

众所周知,里面那个玩意可以写成卷积的形式:

\[f(n)=\sum\limits_{j=0}^n2^jj!\sum\limits_{k=0}^j\tfrac{(-1)^k}{k!}\tfrac{\sum\limits_{i=0}^n(j-k)^i}{(j-k)!}
\]

继续发现里面的第二项的分子是等比数列求和,设\(A(x)=\tfrac{(-1)^x}{k!}\),\(B(x)=\tfrac{\sum\limits_{i=0}^nx^i}{x!}\),把\(B\)里面的等比数列求和:

\[B(x)=\tfrac{i^{n+1}-1}{i!(i-1)}
\]

突然发现似乎所有东西都能求了,直接上\(NTT\)求卷积,再扫一遍就行了。时间复杂度\(O(nlogn)\)。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm> using namespace std;
const int N=100005;
const int MOD=998244353;
typedef long long LL; int n,A[N<<2],B[N<<2],rev[N<<2];
int fac[N],inv[N],limit=1,ans; inline int fast_pow(int x,int y){
int ret=1;
for(;y;y>>=1){
if(y&1) ret=(LL)ret*x%MOD;
x=(LL)x*x%MOD;
}
return ret;
} inline int add(int x){
if(x<0) x+=MOD;if(x>=MOD) x-=MOD;return x;
} inline void NTT(int *f,int type){
for(int i=0;i<limit;i++)
if(i<rev[i]) swap(f[i],f[rev[i]]);
int Wn,w,tmp;
for(int i=2;i<=limit;i<<=1){
Wn=fast_pow(3,(MOD-1)/i);
for(int j=0,len=i>>1;j<limit;j+=i){w=1;
for(int k=j;k<j+len;k++){
tmp=(LL)w*f[k+len]%MOD;f[k+len]=add(f[k]-tmp);
f[k]=add(f[k]+tmp);w=(LL)w*Wn%MOD;
}
}
}
if(type==1) return ;
int INV=fast_pow(limit,MOD-2);
reverse(f+1,f+limit);
for(int i=0;i<limit;i++) f[i]=(LL)f[i]*INV%MOD;
} int main(){
scanf("%d",&n);fac[0]=B[0]=1;B[1]=n+1;
for(int i=1;i<=n;i++) fac[i]=(LL)fac[i-1]*i%MOD;
inv[n]=fast_pow(fac[n],MOD-2);
for(int i=n-1;~i;i--) inv[i]=(LL)inv[i+1]*(i+1)%MOD;
while(limit<=2*n) limit<<=1;
for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(limit>>1):0);
for(int i=0;i<=n;i++) A[i]=(i&1)?(MOD-inv[i]):inv[i];
for(int i=2;i<=n;i++)
B[i]=(LL)(fast_pow(i,n+1)-1)*inv[i]%MOD*fast_pow(i-1,MOD-2)%MOD;
NTT(A,1);NTT(B,1);
for(int i=0;i<limit;i++) A[i]=(LL)A[i]*B[i]%MOD;
NTT(A,-1);int now=1;
for(int i=0;i<=n;i++){
ans=(ans+(LL)fac[i]*now%MOD*A[i]%MOD)%MOD;
now<<=1;if(now>=MOD) now-=MOD;
}
printf("%d\n",ans);
return 0;
}

BZOJ 4555(第二类斯特林数+NTT)的更多相关文章

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

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

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

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

  3. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  4. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

  5. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

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

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

  7. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)

    Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: $$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\tim ...

  8. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

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

随机推荐

  1. Ubuntu里wine使用fcitx输入法

    将启动变为脚本,添加 export XMODIFIERS="@im=fcitx"export GTK_IM_MODULE="fcitx"export QT_IM ...

  2. 如何保留小数点后N位?

    2014年10月17日09:48:39 在做项目中遇到的,要把想显示的数据进行规定小数位的保留,下面写一下用过的方法: 1. BigDecimal 方法(我做项目的时候用的方法) 代码: java.m ...

  3. rabbitmq for C#的异步消息确认机制

    代码: using (var conn = RabbitmqHelper.GetConnection()) { using (var channel = conn.CreateModel()) { / ...

  4. sdb报告-10 错误问题定位

    # sdb报告-10 错误问题定位在sdb 的集群环境中,如果面对的是一个高并发的操作场景,有时候会莫名其妙地报告 -10 错误. 在 sdb 的错误列表中,-10 错误代表:系统错误. 这是一个笼统 ...

  5. git设置忽略文件.gitignore

    在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按照linux的方式来新建.gitignore文件 ...

  6. Java数据访问对象模式

    数据访问对象模式或DAO模式用于将低级数据访问API或操作与高级业务服务分离. 以下是数据访问对象模式的参与者. 数据访问对象接口 - 此接口定义要对模型对象执行的标准操作. 数据访问对象具体类 - ...

  7. 使用systemctl管理服务

    系统服务,开机不需要登录就能运行的程序(相当于开机自启)/usr/lib/systemd/system 用户服务,需要登录后才能运行的程序/usr/lib/systemd/user 目录下又存在两种类 ...

  8. Git的安装配置

    Git是什么 Git是一款免费.开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 与常用的版本控制工具CVS.Subversion等不同的是它采用了分布式版本库的方式,不必 ...

  9. BZOJ 4657 (网络流)

    题面 Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. 攻击方法是:对于 ...

  10. FastReport.net 使用 WebForm 实现打印 最简单版

    1.安装demo 2.设计模版 设计器 -->report-->添加数据源-->添加sql查询->起名字(车信息)下一步-->填写sql语句(select top 1 * ...