ARC172D

arc172d

这个题的官方题解是人类能想到的吗?

给一个比较正常的做法。

我们需要构造 NN 个点,使得它们之间的 N(N1)/2N(N-1)/2 个距离满足给定的严格递增顺序。
使用欧几里得距离公式的展开形式:

d(pi,pj)2=pi2+pj22pipj d(p_i, p_j)^2 = \|p_i\|^2 + \|p_j\|^2 - 2 p_i \cdot p_j

如果我们强制所有点的模长平方 pi2\|p_i\|^2 为一个常数 CC(即所有点位于同一个超球面上),那么距离公式简化为:

d(pi,pj)2=2C2pipj d(p_i, p_j)^2 = 2C - 2 p_i \cdot p_j

显然,距离越小,内积(点积)越大;距离越大,内积越小。

因此,问题转化为构造一组向量,使得它们的内积 pipjp_i \cdot p_j 满足与给定距离顺序相反的顺序。可以通过构造一个 Gram 矩阵 MM 来实现这一点,其中 Mij=pipjM_{ij} = p_i \cdot p_j。具体的 Gram 矩阵构造方法可以看 https://www.jstor.org/stable/2333639?read-now=1&seq=1

qoj3265

qoj3265

二项式定理告诉我们:

(1+x)nk=m=0nkCnkmxm (1 + x)^{nk} = \sum_{m=0}^{nk} C_{nk}^m x^m

我们需要的是 mr(modk)m \equiv r \pmod k 的那些项的系数和。
如果我们在这个多项式环中,定义 xk=1x^k = 1,即在模 xk1x^k - 1 的意义下进行运算,那么:

xmxmmodk(modxk1) x^m \equiv x^{m \bmod k} \pmod{x^k - 1}

这意味着,(1+x)nk(modxk1)(1+x)^{nk} \pmod{x^k - 1} 展开后的结果中,xrx^r 的系数正是所有 mmodk=rm \bmod k = rCnkmC_{nk}^m 之和。

答案就是多项式 (1+x)nk(1+x)^{nk} 在模 xk1x^k - 1 下,xrx^r 的系数。

直接快速幂一下就做完了。

CF482C

cf482c

对于取值为非负整数的随机变量 XX

E[X]=k=0P(X>k)E[X] = \sum_{k=0}^{\infty} P(X > k)

因为最大询问次数为 MM,也就是:

E=k=0M1P(询问 k 次之后仍无法唯一确定目标)E = \sum_{k=0}^{M-1} P(\text{询问 } k \text{ 次之后仍无法唯一确定目标})

假设我们询问了一个位置集合(用二进制掩码 maskmask 表示),在这个 maskmask 下,如果目标字符串 SiS_i 和另一个字符串 SjS_j 在所有询问位置上的字符都相同,那么我们就无法区分 SiS_iSjS_j。此时,我们称 SiS_i 在掩码 maskmask 下是不可区分的。

定义 badmaskbad_{mask}:当询问集合为 maskmask 时,不可区分的字符串集合。

然后考虑 SOS dp,

badmask{i} = badmaskbad_{mask \setminus \{i\}} \ |= \ bad_{mask}

显然,dp 之后,

P(X>k)=1N(Mk)mask=kpopcount(badmask)P(X > k) = \frac{1}{N \cdot \binom{M}{k}} \sum_{|mask|=k} \text{popcount}(bad_{mask})

最终答案即为 k=0M1P(X>k)\sum_{k=0}^{M-1} P(X > k)

qoj9492

qoj9492

显然,问题可以转化为:

  1. 每个节点 uu 可以映射为一个二维点 (dfn1u,dfn2u)(dfn1_u, dfn2_u)
  2. T1T_1 上的路径修改对应于 dfn1dfn1 维度上的若干区间加值。
  3. T2T_2 上的路径查询对应于 dfn2dfn2 维度上的若干区间求和。

问题本质上就是二维区域权值维护。由于操作是在线的,且 N,MN, M 较大,直接使用二维线段树或树套树空间和时间开销较大。

我们可以对 XX 轴(即 dfn1dfn1)进行分块。

  • XX 轴分成 N\sqrt{N} 个块。
  • 每个块内部存储该块内的点,并按 YY 轴(dfn2dfn2)排序。
  • 每个块维护一个懒标记 tagtag(用于整块加值)和块内点权的前缀和数组(用于快速查询)。

对于每次修改,在 T1T_1 上通过 HLD 分解为 O(logN)O(\log N)XX 区间。对于每个区间:

  • 若区间完全覆盖某块,更新该块 tagtag

  • 若区间部分覆盖某块,暴力更新块内节点的权值 AA,并重构该块的排序前缀和数组。

对于每次查询,在 T2T_2 上通过 HLD 分解为 O(logN)O(\log N)YY 区间。对于每个区间:

遍历所有块。在块内二分到 YY 区间对应的点集,结合前缀和与 tagtag 计算贡献。

考虑去掉二分。

我们可以维护一个 cnty,bcnt_{y,b},表示在块 bb 中,dfn2dfn2 值小于等于 yy 的节点数量。由于块内节点是按 dfn2dfn2 排序的,cnty,bcnt_{y,b} 的值恰好就是二分到的下标。查询复杂度降为 O(NBlogN)O(\frac{N}{B} \log N)

最优块大小应为 N450\sqrt{N} \approx 450

UOJ574

uoj574

来一个不用动脑子的做法。

原离散概率过程可以等价地转化为连续时间过程。假设每个燃料舱接收燃料的时间间隔服从独立的指数分布,那么第 ii 个燃料舱获得第 kk 单位燃料的时间 Ti,kT_{i,k} 服从 Gamma 分布 Γ(k,1)\Gamma(k, 1)
由于选择是均匀随机的,这种连续化模型不会改变事件发生的相对顺序概率。

过程停止的时刻是所有燃料舱都至少有 bb 单位燃料。设 τi\tau_i 为第 ii 个燃料舱达到 bb 单位燃料的时间,则停止时间

Tstop=max(τ1,τ2,,τn)T_{stop} = \max(\tau_1, \tau_2, \dots, \tau_n)

我们关注某一个特定燃料舱(例如燃料舱 1)在停止时是否已满(达到 aa 单位)。设 ρ1\rho_1 为燃料舱 1 达到 aa 单位燃料的时间。如果 ρ1Tstop\rho_1 \le T_{stop},则该燃料舱在停止时已满。
由对称性,期望满舱数 = n×P(ρ1Tstop)n \times P(\rho_1 \le T_{stop})

我们需要计算 P(ρ1max(τ2,,τn))P(\rho_1 \le \max(\tau_2, \dots, \tau_n))
利用补集转化:P(ρ1M)=1P(M<ρ1)P(\rho_1 \le M) = 1 - P(M < \rho_1),其中 M=max(τ2,,τn)M = \max(\tau_2, \dots, \tau_n)

P(M<t)=P(所有 j{2..n},τj<t)=(Fb(t))n1P(M < t) = P(\text{所有 } j \in \{2..n\}, \tau_j < t) = (F_b(t))^{n-1},其中 Fb(t)F_b(t)Γ(b,1)\Gamma(b, 1) 的累积分布函数。

已知 Fb(t)=1etj=0b1tjj!=1etPb(t)F_b(t) = 1 - e^{-t} \sum_{j=0}^{b-1} \frac{t^j}{j!} = 1 - e^{-t} P_b(t),其中 Pb(t)P_b(t) 是截断泰勒多项式。

于是我们需要计算:

E[(Fb(ρ1))n1]=0(1etPb(t))n1fa(t)dt E[(F_b(\rho_1))^{n-1}] = \int_0^\infty (1 - e^{-t} P_b(t))^{n-1} f_a(t) dt

其中 fa(t)=ta1et(a1)!f_a(t) = \frac{t^{a-1} e^{-t}}{(a-1)!}ρ1\rho_1 的概率密度函数。

然后展开 (1etPb(t))n1(1 - e^{-t} P_b(t))^{n-1}

k=0n1(n1k)(1)kekt(Pb(t))k \sum_{k=0}^{n-1} \binom{n-1}{k} (-1)^k e^{-kt} (P_b(t))^k

我们需要计算 (Pb(t))k(P_b(t))^k。由于 kk 从 0 到 n1n-1,我们可以迭代地计算 (Pb(t))k=(Pb(t))k1×Pb(t)(P_b(t))^k = (P_b(t))^{k-1} \times P_b(t),这东西能用 NTT 加速。

对于每一项,我们需要计算积分:

0ta1et(a1)!ekt(cmtm)dt=1(a1)!cm0ta+m1e(k+1)tdt \int_0^\infty \frac{t^{a-1} e^{-t}}{(a-1)!} e^{-kt} \left( \sum c_m t^m \right) dt = \frac{1}{(a-1)!} \sum c_m \int_0^\infty t^{a+m-1} e^{-(k+1)t} dt

利用 0xNeλxdx=N!λN+1\int_0^\infty x^N e^{-\lambda x} dx = \frac{N!}{\lambda^{N+1}},上述积分变为:

1(a1)!cm(a+m1)!(k+1)a+m \frac{1}{(a-1)!} \sum c_m \frac{(a+m-1)!}{(k+1)^{a+m}}

总复杂度为 O(kblog(kb))O(n2blog(nb))\sum O(kb \log(kb)) \approx O(n^2 b \log(nb))