Description

在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\leq j\leq i-1$。
边界条件为:$S(i,i)=1(0\leq i),S(i,0)=0(1\leq i)$
你能帮帮他吗?

Input

输入只有一个正整数$n$

Output

输出$f(n)$。

由于结果会很大,输出$f(n)$对$998244353(7×17×223+1)$取模的结果即可。

题解:

递推式给你就是玩你的,一点关系都没有!

第二类斯特林数通项公式:

$$S(i,j)=\frac{1}{j!}\sum_{k=0}^j(-1)^k C_j^k(j-k)^i$$

代入原式得

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

组合数展开得

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

交换枚举顺序得

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

看到又有$k$又有$j-k$,这不是卷积吗?

令 $a(x)=\sum_{x=0}^n{(-1)^x\over x!}$

$b(x)={1\over (x)!}\sum_{i=0}^n(x)^i$

则 $f(x)=(x!)2^x\sum_{i=0}^n a(x)b(x-i)$

不过循环边界到n不会越界吗?这对答案没有影响,因为斯特林数和组合数都为0。

那就直接NTT了,刚好给了一个NTT模数。(这莫非是提示?)

CODE:

 #include<iostream>
#include<cstdio>
using namespace std; #define mod 998244353
int n,bit=,rev[],ans=;
long long fac[],inv[],ivf[];
long long a[],b[]; int qpow(int x,int y){
int ans=;
while(y){
if(y&)ans=1LL*ans*x%mod;
y>>=,x=1LL*x*x%mod;
}
return ans;
} void init(){
fac[]=ivf[]=inv[]=inv[]=;
for(int i=;i<=n;i++)fac[i]=fac[i-]*i%mod;
for(int i=;i<=n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<=n;i++)ivf[i]=ivf[i-]*inv[i]%mod;
a[]=b[]=;
for(int i=,f=-;i<=n;i++,f=-f){
if (i==)a[i]=n+;
else a[i]=ivf[i]*(qpow(i,n+)-)%mod*inv[i-]%mod;
b[i]=f*ivf[i]%mod;
if(a[i]<)a[i]+=mod;
if(b[i]<)b[i]+=mod;
}
} void get_rev(){
while(bit<=n+n)bit<<=;
for(int i=;i<bit;i++)
rev[i]=(rev[i>>]>>)|(i&)*(bit>>);
} void NTT(long long a[],int dft){
for(int i=;i<bit;i++)
if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<bit;i<<=){
long long W=qpow(,(mod-)/i/);
if(dft==-)W=qpow(W,mod-);
for(int j=;j<bit;j+=i<<){
long long w=;
for(int k=j;k<i+j;k++,w=w*W%mod){
long long x=a[k];
long long y=w*a[k+i]%mod;
a[k]=(x+y)%mod,a[k+i]=(x+mod-y)%mod;
}
}
}
int inv=qpow(bit,mod-);
if(dft==-)for(int i=;i<bit;i++)a[i]=a[i]*inv%mod;
} int main(){
scanf("%d",&n);
init();
get_rev();
NTT(a,),NTT(b,);
for(int i=;i<bit;i++)(a[i]*=b[i])%=mod;
NTT(a,-);
for(int i=;i<=n;i++){
ans+=qpow(,i)*fac[i]%mod*a[i]%mod;
if(ans>=mod)ans-=mod;
}
printf("%d",ans);
}

【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+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. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT

    题目大意 求\(f(n)=\sum_{i=0}^n\sum_{j=0}^i2^j\times j!\times S(i,j)\\\) 对\(998244353\)取模 \(n\leq 100000\) ...

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. The expected type was 'System.Int64' but the actual value was null.”

    System.InvalidOperationException:“An exception occurred while reading a database value for property ...

  2. ajax $.post 一直报 Forbidden (CSRF token missing or incorrect.)

    由于后台整合类视图代码,所以修改了写法,完了之后用下面的写法写的post请求都报 403 error $.post( "{% url 'test_record:select_node_pag ...

  3. Java常用的一些容器

    转自:https://www.cnblogs.com/LipeiNet/p/5888513.html 前言:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点 ...

  4. 【主席树】bzoj1112: [POI2008]砖块Klo

    数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...

  5. numpy学习(一)

    numpy数据类型 # numpy创建对象,numpy创建的对象是n阶矩阵,类似python中列表的嵌套 nd = np.array([[1,2,3,4,5],[2,3,4,6,5]])nd 结果: ...

  6. Ajax请求出现406的原因

    一般出现406错误有两种可能: 1.如果后缀是html是不能响应json数据的.需要修改后缀名. 在做伪静态化过程中,以.html结尾的后缀,做post请求时,不能响应json格式,这是spring官 ...

  7. LNMP一键安装包开启pathinfo和rewrite模式

    此教程适用于集成安装包lnmp,官网是https://lnmp.org/ 一. 开启pathinfo #注释 下面这一行 #include enable-php.conf #载入新的配置文件 incl ...

  8. python入门:模拟简单用户登录(自写)

    #!/usr/bin/env python # -*- coding: utf-8 -*- #模拟简单用户登录(自写) import getpass a = raw_input("Pleas ...

  9. python入门:if和else的基本用法

    #!/usr/bin/env python # -*- coding:utf-8 -*- #2.X用raw_input,3.X用input #if和else的基本用法 name = input(&qu ...

  10. nrf51822微信开发2:[转]airkiss/airsync介绍

    "微信蓝牙"专题共分为8部分 1.airkiss/airsync介绍 2.eclipes的j2ee软件使用教程 3.微信公众号使用Dome(airkiss/airsync) 4.新 ...