2025.2.14 NOI 模拟赛 题解

T1 AT_arc185_d [ARC185D] Random Walk on Tree

题意

有一颗 \(n\times m+1\) 个点的树,点 \(i\)\(1\le i\le n\times m\))连向 \(\max(0,i-n)\),从 \(0\) 开始随机游走,求遍历所有节点的期望时间,\(n,m\le2\times10^5\)

分析

树的形态为 \(0\) 下面挂了 \(n\)\(m\) 个点的链

\(f_i\) 表示已经遍历了 \(i\) 条链,现在在节点 \(0\),从当前状态开始到 遍历 \(n\) 条链且回到节点 \(0\) 的期望时间

\(E\) 为从 \(0\) 走到一条链的第一个点,然后在这条链中随机游走,第一次回到 \(0\) 的时间

\(P\) 表示在该过程中到达过链底(即遍历整条链)的概率

\(P'_i=\frac{n-i}n\times P\) 表示已经遍历了 \(i\) 条链的情况下,从 \(0\) 出发随机选择下一条链,恰好遍历了一条新的链的概率

\(e'\) 为长为 \(m+1\) 的链上,从一端随机游走到另一端的概率

\(f\) 的转移为

\[f_i=E+P'_if_{i+1}+(1-P'_i)f_i \]

化简为

\[f_i=f_{i+1}+\frac E{P'_i} \]

答案为

\[\begin{aligned} -e'+f_0=&-e'+\sum_{i=0}^{n-1}\frac E{P'_i}\\ =&-e'+\sum_{i=0}^{n-1}\frac E{\frac{n-i}n\times P}\\ =&-e'+\frac {En}P\sum_{i=0}^{n-1}\frac 1{n-i}\\ =&-e'+\frac {En}P\sum_{i=1}^{n}\frac 1i\\ \end{aligned} \]

问题转化为求 \(P,E,e'\)

先考虑 \(P\),其为马尔科夫链问题,相当于长为 \(m+1\) 的链,节点分别为 \(0\sim m\),从 \(0\) 开始,第一步强制向右,第一次回到 \(0\) 之前到达过 \(m\) 的概率

\(t_i\) 表示从 \(i\) 出发随机游走,回到 \(0\) 之前到达过 \(m\) 的概率

\(P=t_1\)\(t_0=0\)\(t_m=1\)\(t_i=\frac{t_{i-1}+t_{i+1}}2\),显然为等差数列,因此 \(t_i=\frac im\)因此 \(P=\frac 1m\)

然后考虑 \(E\)\(e'\)

\(e_i\) 表示长为 \(m+1\) 的链编号 \(0\sim m\),从 \(i\) 开始随机游走,第一次到达 \(0\) 的期望步数

\(E=e_1+1,e'=e_m\)\(e_0=0,e_m=e_{m-1}+1\)

转移为

\[e_i=1+\frac{e_{i-1}+e_{i+1}}2 \]

化为

\[(e_i-e_{i-1})=2+(e_{i+1}-e_i) \]

\(x_i=e_i-e_{i-1}\),则 \(x_i=2+x_{i+1}\)\(x_m=1\),因此 \(x_i=2(m-i)+1\)

因此 \(e_i-e_{i-1}=2+x_{i+1}=2(m-i-1)+1=2(m-i)-1\)

可得 \(e_i=\sum_{j=1}^i (2(m-j)-1)=2mi-i^2\)

因此 \(E=2m-1+1=2m\)\(e'=e_m=m^2\)

带入之前的式子,可得答案为

\[-e'+\frac {En}P\sum_{i=1}^{n}\frac 1i=-m^2+2m^2n\sum_{i=1}^{n}\frac 1i \]

\(O(n)\) 递推出 \(1\sim n\) 的逆元后直接计算即可,时间复杂度 \(O(n)\),瓶颈在于计算 \(\sum_{i=1}^n \frac1i\)

可以通过筛优化到 \(O\left(\dfrac{n^{3/4}}{\log n}\right)\)

代码

T2 P3824 [NOI2017] 泳池

题意

一个 \(1001\times n\) 的矩阵,每个位置 \(p\) 的概率为 \(0\)\(1-p\) 的概率为 \(1\),定义矩阵的面积为与其第一行有交的最大全 \(0\) 矩阵的面积,求矩阵的面积恰好为 \(k\) 的概率,\(n\le10^9,k\le1000\)

分析

答案等于 矩阵的面积 \(\le k\) 的概率 减去 矩阵的面积 \(\le k-1\) 的概率,只考虑前者,后者实现相同

对于某种可能的矩阵,令 \(a_i\) 为满足第 \(i\) 列前 \(a_i\) 行全为 \(0\) 的最大值,则矩阵的面积为 \(\max_{1\le l\le r\le n}((r-l+1)\min(a[l:r]))\)

\(dp_{w,h}\) 表示 \(w\) 列的矩阵的每个 \(a_i\)\(\ge h\),且矩阵的面积 \(\le k\) 的概率

\(dp_{0,\ast}=1\)

转移时枚举第一个最小的 \(a_i\) 的位置

\[dp_{w,h}=dp_{w,h+1}+p^h(1-p)\sum_{i=1}^w dp_{i-1,h+1} dp_{w-i,h} \]

答案为 \(dp_{n+1,0}\)

只要计算 \(wh\le k\)\(dp_{w,h}\) 即可,直接 \(dp\)\(O(n^2)\) 的(此时假设 \(n,k\) 同级)

显然合法矩阵中,不可能有连续 \(k+1\) 个及以上的 \(a_i\) 为正整数

因此先处理出 \(w\le k\)\(dp_{w,h}\),然后考虑每次加入一段非 \(0\)

\(g_w\) 表示宽为 \(w\),最后一列的 \(a_w=0\),矩阵面积不超过 \(k\) 的概率

显然 \(g_0=1\),要求的为 \(g_{n+1}\)

转移为

\[g_i=(1-p)\sum_{i=1}^{k+1} g_{i-j} {dp}_{j-1,1} \]

这是常系数齐次线性递推,令 \([x^{k+1}]f(x)=1\)\([x^{k+1-i}]f(x)=(1-p){dp}_{i-1,1}\),令 \(g(x)=x^n\bmod f(x)\),预处理 \(g_{0\sim k}\),则答案为 \(\sum_{i=0}^k g_i[x^i]g(x)\)

时间复杂度 \(O(k^2\log n)\),可优化到 \(O(k\log k\log n)\)

代码(赛时模数改为 \(10^9+7\),其余不变)

T3 yukicoder No.2023 Tiling is Fun 加强版

题意

有一个六边形,六个顶点依次为 \((a,0),(a+b,0),(a+b,c),(b,a+c),(0,a+c),(0,a)\),有三种图形,第一个为边长 \(1\) 的正方形,第二个和第三个底和高为 \(1\) 右下角为 \(45^\circ\) 的平行四边形,第二个底边和 \(x\) 轴平行,第三个高和 \(x\) 轴平行,三者各自有无限个,要用它们恰好覆盖六边形(只能平移),求方案数,\(a,b,c\le5\times10^5\)

六边形:
 __
|  \
|   |
|   | c
 \__|
a  b
三种图形:
 _     _    |\
|_|   \_\    \|

分析

先考虑 \(a=1\) 的情况,显然对于一种合法的铺设情况,其中的二类和三类图形组成一条左下到右上的路径,仅考虑其下边沿,则为 \((a,0)\)\((a+b,c)\) 的路径,一共 \(\binom{b+c}c\) 种可能

然后考虑 \(a\ne 1\) 的情况

此时一共 \(a\) 条路径,第 \(i\) 条起点为 \((i,a-i)\),终点为 \((b+i,c+a-i)\),要求两两不交

\([f(i,j)]\) 表示位置 \((i,j)\)\(f(i,j)\)\(a\times a\) 的矩阵(\(1\le i,j\le a\)

根据 \(LGV\) 引理,答案为

\[\det\left[\binom{b+c}{b+j-i}\right] \]

暴力计算总时间复杂度为 \(O(a^3+b+c)\) ,需要化简

重复 \(a-1\) 次以下过程:第 \(i\) 次中,令第 \(a\) 行加上第 \(a-1\) 行,第 \(a-1\) 行加上第 \(a-2\) 行,以此类推,最后为第 \(i+1\) 行加上第 \(i\)

这样操作后,原矩阵变为

\[\left[\binom{b+c+i-1}{b+j-1}\right] \]

转化为下降幂

\[\det\left[\frac{(b+c+i-1)^{\underline{b+j-1}}}{(b+j-1)!}\right] \]

每行将 \((b+j-1)!\) 提到前面

\[\prod_{j=1}^a\frac1{(b+j-1)!}\times \det\left[(b+c+i-1)^{\underline{b+j-1}}\right] \]

其中 \((b+c+i-1)^{\underline{b+j-1}}=(b+c+i-1)^{\underline b}(c+i-1)^{\underline {j-1}}\),再将 \((b+c+i-1)^{\underline b}\) 提到前面,则化为

\[\prod_{i=1}^a\frac{(b+c+i-1)^{\underline b}}{(b+i-1)!}\times \det\left[(c+i-1)^{\underline{j-1}}\right] \]

右侧为范德蒙德矩阵,因此可化简为

\[\prod_{i=1}^a\frac{(b+c+i-1)^{\underline b}}{(b+i-1)!}\times \prod_{1\le i<j\le n}(j-i) \]

化简得

\[\prod_{i=0}^{a-1}\frac{(b+c+i)^{\underline b}}{(b+i)!}\times \prod_{i=0}^{a-1} i! \]

拆开下降幂得

\[\prod_{i=0}^{a-1}\frac{i!(b+c+i)!}{(b+i)!(c+i)!} \]

预处理后计算即可

时间复杂度 \(O(a+b+c)\)

代码:

#include <bits/stdc++.h>
using namespace std;
constexpr int M = 998244353;
int mul(int x, int y){return static_cast<long long>(x) * y % M;} void smul(int &x, int y){x = mul(x, y);}
template <typename... Arg> void smul(int &x, int y, int z, Arg... arg){smul(x, y); smul(x, z, arg...);}
int a, b, c, rs = 1;
int fc[1500010], ivfc[1500010], iv[1500010];
int main(){
    freopen("c.in", "r", stdin);
    freopen("c.out", "w", stdout);
    cin >> a >> b >> c;
    fc[0] = fc[1] = ivfc[0] = ivfc[1] = iv[1] = 1;
    for (int i = 2; i <= a + b + c; ++i)fc[i] = mul(fc[i - 1], i), ivfc[i] = mul(ivfc[i - 1], iv[i] = mul(iv[M % i], M - M / i));
    for (int i = 0; i < a; ++i)smul(rs, fc[b + c + i], fc[i], ivfc[c + i], ivfc[b + i]);
    cout << rs << endl;
    return 0;
}
/*
rs = \prod_{i=0}^{a-1} \frac{(b+c+i)^{\underline{b}}}{(b+i)^{\underline{b}}}
*/
/*
1 1 1                           2
1 1 496715                      496716
1 1 498537                      498538
1 947 951                       651450559
2 499368 498416                 181080685
493408 490933 498071            96174609
491056 232630 224660            812606967
*/

比赛结果

有事没有参加,最高分 \(100+100+72\)

posted @ 2025-02-14 20:11  Hstry  阅读(60)  评论(0)    收藏  举报