题面

Words

有 \(n\) 天,每天插入一个字符集大小为 \(c\) 长度为 \(l\) 的字符串,求每一天建立 \(\tt Trie\) 树的期望节点数(根节点不算)模 \(998244353\)。

数据范围:\(1\le n\le 10^5\),\(1\le c,l\le 10^9\)。

  • Input
5 4 3
  • Output
4
911976330
792083550
276733174
815453946

正解

转化问题:有一颗高度为 \(l+1\) 的 \(c\) 叉完全 \(\tt Trie\),从根到叶走 \(n\) 遍,求期望经过节点数(根节点不算)。

一层一层考虑,答案为(因为不考虑根节点,所以 \(i\) 从 \(1\) 开始):\(Ans(n)=\sum_{i=1}^l a(i,n)\)。

考虑新的路径会不会走新节点,可以递推:

\[a(i,n)=a(i,n-1)+\frac{c^i-a(i,n-1)}{c^i}\\
a(i,n)=1+a(i,n-1)(1-\frac{1}{c^i})\\
\]

特征方程:\(t=1+(1-\frac{1}{c^i})t\Longrightarrow t=c^i\)。

\[a(i,n)-c^i=(1-\frac{1}{c^i})(a(i,n-1)-c^i)\\
\begin{split}
a(i,n)=&(1-\frac{1}{c^i})(a(i,n-1)-c^i)+c^i\\
=&(1-\frac{1}{c^i})^n(a(i,0)-c^i)+c^i\\
=&c^i-c^i(1-\frac{1}{c^i})^n\\
\end{split}
\]

带回到上面求每一天答案的式子,展开二项式 \(^{\color{#bcbcee}{[1]}}\),交换枚举顺序 \(^{\color{#bceebc}{[2]}}\),抵消 \(^{\color{#eebcbc}{[3]}}\):

\[\begin{split}
Ans(n)=&\sum_{i=1}^l a(i,n)\\
=&\sum_{i=1}^l\left(c^i-c^i(1-\frac{1}{c^i})^n\right)\\
=&\sum_{i=1}^l c^i-\sum_{i=1}^lc^i(1-\frac{1}{c^i})^n\\
=&\sum_{i=1}^l c^i-\sum_{i=1}^lc^i\sum_{j=0}^n\left(\frac{1}{c^i}\right)^j(-1)^j{n\choose j}&^{\color{#bcbcee}{[1]}}\\
=&\sum_{i=1}^l c^i-\sum_{i=0}^n(-1)^i{n\choose i}\sum_{j=1}^l c^j\left(\frac{1}{c^j}\right)^i&^{\color{#bceebc}{[2]}}\\
=&-\sum_{i=1}^n(-1)^i{n\choose i}\sum_{j=1}^l c^j\left(\frac{1}{c^j}\right)^i&^{\color{#eebcbc}{[3]}}\\
=&\sum_{i=1}^n(-1)^{i+1}{n\choose i}\sum_{j=1}^l c^j\left(\frac{1}{c^j}\right)^i\\
=&\sum_{i=1}^n\frac{n!}{i!(n-i)!}(-1)^{i+1}\sum_{j=1}^l \left(\frac{1}{c}\right)^{j(i-1)}\\
=&n!\sum_{i=1}^n\frac{1}{i!(n-i)!}(-1)^{i+1}\sum_{j=1}^l \left(\frac{1}{c}\right)^{j(i-1)}\\
\end{split}
\]

发现有 \(i!\) 和 \((n-i)!\),并且每个 \(Ans(x)\) 都要求,所以想到 \(\tt NTT\)。

\[\begin{split}
Ans(n)=&n!\sum_{i=1}^n\frac{1}{i!(n-i)!}(-1)^{i+1}\sum_{j=1}^l \left(\frac{1}{c}\right)^{j(i-1)}\\
=&n!\sum_{i+j=n}\left(\frac{(-1)^{i+1}\sum_{j=1}^l \left(\frac{1}{c}\right)^{j(i-1)}}{i!}\right)\left(\frac{1}{j!}\right)\\
\end{split}
\]

只需让 \(f(n)=\frac{(-1)^{n+1}\sum_{j=1}^l \left(\frac{1}{c}\right)^{j(n-1)}}{n!}\),\(g(n)=\frac{1}{n!}\) 卷积即可。

其中 \(\sum_{j=1}^l \left(\frac{1}{c}\right)^{j(n-1)}\) 可以用等比数列的公式算。

时间复杂度 \(\Theta(n\log)\)。


代码

#include <bits/stdc++.h>
using namespace std; //Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define be(a) a.begin()
#define en(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f; //Data
const int N=1e5;
const int mod=998244353;
int n,l,c; //Pow
int Pow(int a,int x){
if(!a) return 0; int res=1;
for(;x;a=(ll)a*a%mod,x>>=1)if(x&1) res=(ll)res*a%mod;
return res;
} //NTT
int iv[N+1],f[N<<2],g[N<<2];
int up(int len){return 1<<int(ceil(log2(len)));}
void Getpoly(){
for(int i=iv[0]=1;i<=n;i++) iv[i]=(ll)iv[i-1]*i%mod;
for(int i=0;i<=n;i++) iv[i]=Pow(iv[i],mod-2);
for(int i=0;i<=n;i++) g[i]=iv[i];
for(int i=1;i<=n;i++){
int ic=Pow(Pow(c,i-1),mod-2);
int q=(ic==1)?l:(ll)ic*(Pow(ic,l)-1+mod)%mod*Pow(ic-1,mod-2)%mod;
f[i]=(ll)iv[i]*q%mod*((i&1)?1:mod-1)%mod;
}
}
const int G=3,iG=332748118;
int lim,r[N<<2];
void NTT(int a[],int t){
for(int i=0;i<lim;i++)if(i<r[i]) swap(a[i],a[r[i]]);
for(int mid=1;mid<lim;mid<<=1){
int wn=Pow(t==1?G:iG,(mod-1)/(mid<<1));
for(int j=0;j<lim;j+=(mid<<1))
for(int w=1,k=j;k<mid+j;w=(ll)w*wn%mod,k++){
int x=a[k],y=(ll)w*a[mid+k]%mod;
a[k]=(x+y)%mod,a[mid+k]=(x-y+mod)%mod;
}
}
if(t==-1){
int ilim=Pow(lim,mod-2);
for(int i=0;i<lim;i++) a[i]=(ll)a[i]*ilim%mod;
}
}
void Mulpoly(){
lim=up(n+n);
for(int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)*lim>>1);
NTT(f,1),NTT(g,1);
for(int i=0;i<lim;i++) f[i]=(ll)f[i]*g[i]%mod;
NTT(f,-1);
} //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>l>>c;
Getpoly(),Mulpoly();
for(int i=1,fa=1;i<=n;i++) fa=(ll)fa*i%mod,f[i]=(ll)f[i]*fa%mod;
for(int i=1;i<=n;i++) cout<<f[i]<<'\n';
return 0;
}

祝大家学习愉快!

最新文章

  1. 在Andoid开发中使用MVP模式来解耦,增加可测试性
  2. linux之ps命令
  3. SQL Server中的事务日志管理(3/9):事务日志,备份与恢复
  4. Redis基础知识之————php-Redis 常用命令专题
  5. MATLAB符号运算
  6. Class org.apache.struts2.json.JSONWriter can not access a member of
  7. delete了,析构函数却没有调用
  8. bootstrap-datepicker的简单使用
  9. Asp.net MVC4高级编程学习笔记-视图学习第三课Razor页面布局20171010
  10. Python高级特性:迭代
  11. 在 vue.js 中动态绑定 v-model
  12. 【Dubbo 源码解析】03_Dubbo Protocol&amp;Filter
  13. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
  14. android开发 系统时间与定时器之间有关系嘛?
  15. [noip模拟题]LGTB 玩THD
  16. JsonCpp操作数组对象
  17. java web 页面提速
  18. RESTful api 与 Django的 restfulframework
  19. matlab将矩阵写入文件
  20. my27_OGG MySQL To MySQL错误汇总

热门文章

  1. 编译的Ceph二进制文件过大问题
  2. Java中List,Set,Map区别
  3. API的使用(3)Arrays 类,Math类,三大特性--继承
  4. SpringBoot整合MyBatis,HiKari、Druid连接池的使用
  5. Camtasia中对录制视频进行编辑——音效
  6. 听法国设计师大卫&#183;维森特讲述他与CorelDRAW的渊源
  7. 带你了解Boom 3D的Mac版音效模式
  8. jQuery 第七章 实例方法 位置图形
  9. Java8常用的内置函数式接口(一)Predicate、Consumer、Supplier、Function
  10. transient关键字的作用以及几个疑问的解决