题解-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)=1+a(i,n-1)(1-\frac{1}{c^i})\\
\]
特征方程:\(t=1+(1-\frac{1}{c^i})t\Longrightarrow t=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]}}\):
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\)。

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;
}
祝大家学习愉快!
题解-Words的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 学习一下 Spring Security
一.Spring Security 1.什么是 Spring Security? (1)基本认识 Spring Security 是基于 Spring 框架,用于解决 Web 应用安全性的 一种方案, ...
- Math.floor(Math.random() * array.length),splice
1.Math.floor(Math.random() * array.length) 返回长度内的索引 eg: changeLimit () { function getArrayItems(arr, ...
- python-网络安全编程第六天(threading多线程模块&Queue模块&subprocess模块)
前言 昨天晚上9点多就睡了 2点起来没睡意... 那就学习吧emmmm ,拿起闲置几天的python课程学习.学习到现在5.58了 总结下 继续开始学习新的内容 多多线程? 线程(英语:thread) ...
- 面试阿里,腾讯90%会被问到的zookeeper,把这篇文章看完就够了。
Zookeeper概述 zookeeper高容错数据一致性协议(CP)的分布式小文件系统,提供类似于文件系统的目录方式的数据存储. 全局数据一致性:每个server保存一份相同的数据副本,client ...
- 网络系列之GET与POST请求方式的区别
作为一枚正在学习前端的 小萌新,如果下面哪里有写的不对的话,可以帮我指出来吗,谢谢 1.是基于什么前提的?如果什么前提都没有,不使用任何规范,只考虑语法和理论上的HTTP协议 那么GET和POST几乎 ...
- Redis多线程原理详解
本篇文章为你解答一下问题: 0:redis单线程的实现流程是怎样的? 1:redis哪些地方用到了多线程,哪些地方是单线程? 2:redis多线程是怎么实现的? 3:redis多线程是怎么做到无锁的? ...
- Luogu P2656 采蘑菇
尽管是缩点的习题,思路也是在看了题解后才明白的. 首先,每个强连通分量内的点都是一定互通的,也就是可以完全把这里面的边都跑满,摘掉所有能摘的蘑菇.那么,考虑给每一个强连通分量化为的新点一个点权,代表摘 ...
- mq消息消费,broker选址
PullRequest.MessageQueue.BrokerName 根据PullRequest.MessageQueue得到brokerId,默认0或者用缓存中的suggest,每次消息拉取后会更 ...
- Golang 实现 Redis(8): TCC分布式事务
本文是使用 golang 实现 redis 系列的第八篇, 将介绍如何在分布式缓存中使用 Try-Commit-Catch 方式来解决分布式一致性问题. godis 集群的源码在Github:Godi ...
- Django----Serializer序列化
serializer的两大特征 1.校检数据 2.序列化 首先创建apps/Serializer.py 在序列化里面导包 from rest_framework import serializers ...