【TJOJI\HEOI2016】求和
【TJOI/HEOI2016】求和

这题好难啊!!
斯特林数+NTT。
首先我们将第二类斯特林数用容斥展开,具体原理不解释了。
\(\displaystyle S(i,j)=\frac{1}{j!}\sum_{k=0}^{j}(-1)^{k}C_j^k(j-k)^i=\sum_{k=0}^{j}\frac{(-1)^k}{k!}\cdot\frac{(j-k)^i}{(j-k)!}\)。
我们交换一下\(\sum\)的顺序:
\(\displaystyle f(n)=\sum_{j=0}^{n}2^jj!\sum_{i=0}^{n}S(i,j)\)。这里\(i\)从0开始枚举是没有问题的,因为\(j>i时,S(i,j)=0\)。
将斯特林数展开:
=\sum_{j=0}^{n}2^jj!\sum_{k=0}^j\frac{(-1)^k}{k!}\sum_{i=0}^n\frac{(j-k)^i}{(j-k)!}
\]
很容易看出,最后一个\(\sum\)是一个等比数列求和。
于是我们设\(g(i)=\frac{i^{n+1}-1}{(i-1)*i!},特别地,g(0)=1,g(1)=n+1\)。
于是\(\displaystyle f(n)=\sum_{j=0}^{n}2^jj!\sum_{k=0}^j\frac{(-1)^k}{k!}g(j-k)\)
我们又设\(h(i)=\frac{(-1)^i}{i!}\),则\(\displaystyle f(n)=\sum_{j=0}^{n}2^jj!\sum_{k=0}^jh(k)g(j-k)\)
\(\displaystyle \sum_{k=0}^jh(k)g(j-k)\)是个卷积,可以用NTT来计算。
代码:
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
#define N 200005
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n;
ll fac[N],inv[N];
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
}
ll a[N<<2],b[N<<2],q[N];
const ll g=3;
ll tem[N<<2];
int rev(int x,int len) {
int ans=0;
for(;len;len--,x>>=1) ans=ans<<1|x&1;
return ans;
}
void NTT(ll *a,int x,int flag) {
int n=1<<x;
for(int i=0;i<n;i++) if(i<rev(i,x)) swap(a[i],a[rev(i,x)]);
tem[0]=1;
for(int s=1;s<=x;s++) {
int len=1<<s,mid=len>>1;
ll w=flag==1?ksm(g,(mod-1)/len):ksm(g,mod-1-(mod-1)/len);
for(int i=1;i<mid;i++) tem[i]=tem[i-1]*w%mod;
for(int i=0;i<n;i+=len) {
for(int j=0;j<mid;j++) {
ll u=a[i+j];
ll v=tem[j]*a[i+j+mid]%mod;
a[i+j]=(u+v)%mod;
a[i+j+mid]=(u-v+mod)%mod;
}
}
}
if(flag==-1) {
ll inv=ksm(n,mod-2);
for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
}
}
int bl[1000];
int main() {
n=Get();
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
inv[n]=ksm(fac[n],mod-2);
for(int i=n-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
int flag=1;
for(int i=0;i<=n;i++,flag*=-1) {
if(flag==1) a[i]=inv[i];
else a[i]=(mod-inv[i])%mod;
}
q[0]=1;
q[1]=n+1;
for(int i=2;i<=n;i++) {
q[i]=((ksm(i,n+1)-1)*ksm(i-1,mod-2)%mod+mod)%mod;
}
for(int i=0;i<=n;i++) b[i]=q[i]*inv[i]%mod;
int x=0;
for(int len=n<<2;len;len>>=1,x++);
NTT(a,x,1),NTT(b,x,1);
for(int i=0;i<(1<<x);i++) a[i]=a[i]*b[i]%mod;
NTT(a,x,-1);
ll ans=0;
ll p=1;
for(int i=0;i<=n;i++) {
(ans+=p*fac[i]%mod*a[i]%mod)%=mod;
p=(p<<1)%mod;
}
cout<<ans;
return 0;
}
【TJOJI\HEOI2016】求和的更多相关文章
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- [HEOI2016]求和 sum
[HEOI2016]求和 sum 标签: NTT cdq分治 多项式求逆 第二类斯特林数 Description 求\[\sum_{i=0}^n\sum_{j=0}^i S(i,j)×2^j×(j!) ...
- 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT
[题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...
- 【BZOJ 4555】 4555: [Tjoi2016&Heoi2016]求和 (NTT)
4555: [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 315 Solved: 252 Des ...
- [BZOJ4555][TJOI2016&HEOI2016]求和(分治FFT)
4555: [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 525 Solved: 418[Sub ...
- bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化
[Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 679 Solved: 534[Submit][S ...
- [BZOJ4555 TJOI2016 HEOI2016 求和]
第一篇博客,请大家多多关照.(鞠躬 BZOJ4555 TJOI2016 HEOI2016 求和 题意: 给定一个正整数\(n\)(\(1\leqq n \leqq100000\)),求: \[ ...
- [TJOI2016&&HEOI2016]求和
BZOJ Luogu 求 \[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)*2^j*j!\] 其中\(S(i,j)\)是第二类斯特林数 \(n\le10^5\),模\ ...
随机推荐
- 单机多实例mysq 8.0l部署安装
单机多实例mysql部署安装 目的需求 在单台虚拟机部署部署多实例mysql,用于配置mysql replication,MHA等. 思路 多实例安装mysql可以参考<源编译MySQL8.0的 ...
- Sharepoint 2010 工作流状态值
在Sharepoint2010中,如果要使用工作流状态值进行筛选,必须使用内部值,不能使用文字,要不然是筛选不出来的. 进行中:2 已取消:4 已批准:16 拒绝:17 下边是已取消的工作流状态:
- 菜鸟入门【ASP.NET Core】9:RoutingMiddleware介绍以及MVC引入
前言 前面介绍了使用app.Map来配置路由,但是对于一般不是特别大的项目来说,不使用Map来进行路由配置. 配置路由 我们首先需要在Startup.cs文件中的ConfigureServices方法 ...
- [redis] Redis的介绍
mysql数据库:数据以“文件的形式”存储在硬盘里 网站的瓶颈是在数据库的访问上,mysql数据库是运行在硬盘上面的,把数据放到内存里速度就快多了 Redis是一款内存高速缓存数据库,使用c语言编写, ...
- 6.分析request_irq和free_irq函数如何注册注销中断(详解)
上一节讲了如何实现运行中断,这些都是系统给做好的,当我们想自己写个中断处理程序,去执行自己的代码,就需要写irq_desc->action->handler,然后通过request_irq ...
- 【Java每日一题】20161205
package Dec2016; import java.util.HashSet; public class Ques1205 { public static void main(String[] ...
- LVOOP设计模式在路上(二)-- 策略模式
前言 最近工作还挺忙的,连着好些周都是单休了,今天休息在家就来写写关于策略模式的理解和labivew的实现. 正文 1.什么是策略模式 定义是这样描述的:它定义了算法家族,分别封装起来,让它们之间可以 ...
- hive的行列转换
行转列(把多个行合并) 比如把: id tag 1 12 1 23 2 67 2 78 2 76 行转列之后: id tag 1 12,23 2 67,78,76 使用函数为:concat_w ...
- js判断数据类型的四种方法
1.typeof typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型.返回的结果用该类型的字符串(全小写字母)形式表示,包括number,string,boolean,und ...
- vue项目未加载完成前显示loading...
1.在Index.html里面加入loading的元素,让loading元素显示,让app元素隐藏 <!DOCTYPE html> <html> <head> &l ...