对于一个 01 序列,其得分计算方式如下:
- 令 v=0,w=1;
- 从前往后依次遍历序列,设当前位为 x:
- x=0:v→v−1;
- x=1:先 v→v+2,再 w→w×v;
求所有有 n 个 1,m 个 0 的 01 序列的得分和,对 998244353 取模。
1≤n≤2×105,0≤m≤109。
转化为格路计数问题:
每一步从 (x,y) 走到 (x+1,y) 或 (x,y+1)。
- 从 (x,y) 走到 (x+1,y) 会让路径权值乘上 2x−y+2;
- 从 (x,y) 走到 (x,y+1) 会让路径权值乘上 1;
求从 (0,0) 走到 (n,m) 的所有路径权值之和。
考虑把每一步转移放入序列 a 中,x+1 为 1,否则为 0,则对于每个 ai:
- ai=1:
- i 和它前面的每个 1 都会造成 2 的贡献,故其可以和前面的每个 1 连权值为 2 的无向边 ;
- i 和它前面的每个 0 都会造成 −1 的贡献,故其可以和前面的每个 0 连权值为 −1 的无向边;
- i 还会额外贡献 2 的权值,故其可以和点 0 连权值为 2 的无向边;
- ai=0 则只能和点 0 连权值为 1 的无向边;
那么最终会形成以 0 为根的父亲编号比儿子小的一棵树,并且除了点 0 外其它点的儿子 v 必定满足 av=1。
那么根据 0 的每个儿子满足 av=0 还是 av=1 计算其子树的答案,最后 EGF 组合起来即可。
设 fn 表示 av=0 且大小为 n 的子树的边权积的和(包括 (0,v) 这条边),gn 表示 av=1 且大小为 n 的子树的边权积的和(包括 (0,v) 这条边),那么考虑最后一个点带来的贡献,有:
fn=fn−1×(2(n−2)−1)gn=gn−1×2(n−1)
初值 f0=0,f1=1,g0=0,g1=2。
设 F(x) 和 G(x) 分别为 f 和 g 的 EGF,则答案即为 [(n+m)!xn+m](m!F(x)meG(x))。
注意到 [x0]F(x)=0,所以 F(x) 可以提出一个 x,答案变为 m!(m+n))meG(x))。
进一步,注意到 eG(x) 也是很好求的,设 [n!xn]eG(x)=hn,则考虑最后一个点带来的贡献可以直接求出 h:
hn=hn−1×(2(n−1)+2)
其中 h0=1,h1=2。
设 h 的 EGF 为 H(x),则答案即为 m!(m+n))mH(x)),可以直接 O(nlogn) 算,或者直接快速幂做到 O(nlog2n)。