正题

题目链接:https://www.luogu.com.cn/problem/P4091


题目大意

给出\(n\),求

\[\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!
\]

解题思路

看题解才知道\(2^jj!\)对这\(n\log n\)做法没有任何意义,卡了好久。

首先斯特林数的通项公式是

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

提到这个式子来(因为如果\(j>i\)就是\(0\)所以直接不管这个限制)

\[\sum_{i=0}^n\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k(j-k)^n}{k!(j-k)!}
\]

然后把枚举\(i\)的那层丢到分数那里

\[\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k\sum_{i=0}^{n}(j-k)^i}{k!(j-k)!}
\]

然后这个后面式子就可以卷积了,定义\(F(x)=\frac{(-1)^x}{x!},G(x)=\frac{\sum_{i=0}^nx^n}{x!}\)

然后\(G\)通项公式一下就是\(G(x)=\frac{x^{n+1}-1}{(x-1)x!}\)

时间复杂度\(O(n\log n)\)


\(code\)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=6e5+10,P=998244353;
struct poly{
ll a[N],n;
}G,F;
ll n,ans,fac[N],inv[N],fnv[N],r[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void NTT(ll *f,ll n,ll op){
for(ll i=0;i<n;i++)
if(r[i]<i)swap(f[i],f[r[i]]);
for(ll p=2;p<=n;p<<=1){
ll len=p>>1,tmp=power(3,(P-1)/p);
if(op==-1)tmp=power(tmp,P-2);
for(ll k=0;k<n;k+=p){
ll buf=1;
for(ll i=k;i<k+len;i++){
ll tt=buf*f[i+len]%P;
f[i+len]=(f[i]-tt+P)%P;
f[i]=(f[i]+tt)%P;
buf=buf*tmp%P;
}
}
}
if(op==-1){
ll invn=power(n,P-2);
for(ll i=0;i<n;i++)
f[i]=f[i]*invn%P;
}
return;
}
void mul(poly &a,poly &b){
ll n=1;
while(n<=a.n+b.n)n<<=1;
for(ll i=0;i<n;i++)
r[i]=(r[i>>1]>>1)^((i&1)?(n>>1):0);
NTT(a.a,n,1);NTT(b.a,n,1);
for(ll i=0;i<n;i++)
a.a[i]=a.a[i]*b.a[i]%P;
NTT(a.a,n,-1);return;
}
int main()
{
scanf("%lld",&n);
fac[1]=fac[0]=fnv[0]=inv[1]=1;
for(ll i=2;i<=n;i++)
inv[i]=P-(P/i)*inv[P%i]%P;
for(ll i=1;i<=n;i++)
fac[i]=fac[i-1]*i%P,
fnv[i]=inv[i]*fnv[i-1]%P;
F.a[0]=G.a[0]=1;F.a[1]=P-1;G.a[1]=n+1;fnv[0]=0;
for(ll i=2;i<=n;i++){
F.a[i]=(i&1)?(P-fnv[i]):fnv[i];
G.a[i]=(power(i,n+1)-1)*inv[i-1]%P*fnv[i]%P;
}
G.n=F.n=n;mul(G,F);
for(ll i=0,pw=1;i<=n;i++){
(ans+=G.a[i]*pw%P*fac[i]%P)%=P;
pw=pw*2%P;
}
printf("%lld\n",ans);
return 0;
}

P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】的更多相关文章

  1. 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告

    P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...

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

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

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

  4. [HEOI2016/TJOI2016][bzoj4555] 求和 [斯特林数+NTT]

    题面 传送门 思路 首先,我们发现这个式子中大部分的项都和$j$有关(尤其是后面的$2^j\ast j!$),所以我们更换一下枚举方式,把这道题的枚举方式变成先$j$再$i$ $f(n)=\sum_{ ...

  5. 【BZOJ4555】[TJOI&HEOI2016]求和 斯特林数+NTT

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

  6. P4091 [HEOI2016/TJOI2016]求和

    留待警戒 FFT的时候长度要写的和函数里一样啊XD 瞎扯 这是个第二类斯特林数的理性愉悦颓柿子题目 颓柿子真的是让我hi到不行啦(才没有) 前置芝士 一个公式 \[ \sum_{i=0}^n t^i ...

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

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

  8. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (luogu) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

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

    原题传送门 \[\begin{aligned} a n s &=\sum_{i=0}^{n} \sum_{j=0}^{i}\left\{\begin{array}{c}{i} \\ {j}\e ...

  10. luogu P4091 [HEOI2016/TJOI2016]求和

    传送门 这一类题都要考虑推式子 首先,原式为\[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)*2^j*j!\] 可以看成\[f(n)=\sum_{j=0}^{n}2^ ...

随机推荐

  1. ReentrantLock可重入锁lock,tryLock的区别

    void lock(); Acquires the lock. Acquires the lock if it is not held by another thread and returns im ...

  2. 常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)

    大家好,我是辰哥~ 本文带大家学习正则表达式,并通过python代码举例讲解常用的正则表达式 最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析. 正则表达式语法 Python的re模块( ...

  3. C#高级应用之------HashTable、HashSet和Dictionary的区别(转)

    原文url:http://www.cnblogs.com/akwwl/p/3680376.html 今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTabl ...

  4. 【java虚拟机】类加载机制

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6959615.html 一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中, ...

  5. 辗转相除 求最大公约数!or 最小公倍数

    求最大公约数和最小公倍数的经典算法--辗转相除法描述如下: 若要求a,b两数的最大公约数和最小公倍数,令a为a.b中较大数,b为较小数,算法进一步流程: while(b不为0) { temp=a%b: ...

  6. git撤销已经push到远程仓库上的代码

    具体方法,git命令:git reset --hard <commit_id>git push origin HEAD --force commit_id可以通过git命令:git log ...

  7. 我说Java完全面向对象,老大过来就是一jio

    哈喽,大家好,我是指北君.自从开始学Java,就知道Java是一门面向对象编程的语言,所以在指北君眼中,Java就是完全面向对象的.有一天老大问到我这个事情,我脱口而出,结果老大过来就是一jio... ...

  8. Golang slice作为函数参数

    slice底层其实是一个结构体,len.cap.array分别表示长度.容量.底层数组的地址,当slice作为函数的参数传递的时候,跟普通结构体的传递是没有区别的:如果直接传slice,实参slice ...

  9. Shell 脚本如何输出帮助信息?

    作者展示了一个技巧,将帮助信息写在 Bash 脚本脚本的头部,然后只要执行"脚本名 + help",就能输出这段帮助信息 https://samizdat.dev/help-mes ...

  10. HashMap 为什么线程不安全?

    作者:developer http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线 ...