2024.11.18 NOIP 模拟赛 题解

T1 抽奖2(lottery)P5087 数学

题意

给定 \(a_{1\sim n}\),定义一个序列的权值为所有数的积,求 \(a\) 的所有长度为 \(k\) 的子序列的权值之和,\(k\le n\le10^4\)

分析

\(f_{i,j}\) 表示 \(a_{1\sim i}\) 中长为 \(j\) 的子序列的权值和,直接计算即可,时间复杂度 \(O(nk)\)

代码

T2 经济学(economy)P2155 [SDOI2008] 沙拉公主的困惑

题意

给定 \(t\)\(n_i,m_i\),分别求出 \(1\sim n_i!\) 中与 \(m_i!\) 互质的数的数量取模 \(r\)\(m_i\le n_i\le10^7\)\(t\le10^6\)\(2\le r\le 10^9+10\) 且为质数

分析

可证答案为 \(\frac{n!}{m!}\varphi(m!)\bmod r\)

预处理出 \(1e7\) 以内的质数(不到 \(700000\) 个)

设质数表为 \(p_{1\sim k}\)\(isp_i\) 表示 \(i\) 是否是质数,则答案为

\[\begin{aligned} &\frac{n!}{m!}\varphi(m!)\\ \equiv&n!\prod_{p_i\le m}\frac{p_i-1}{p_i}\\ \equiv&\frac{n!}{\prod_{p_i\le m}p_i}\prod_{p_i\le m}(p_i-1)\\ \equiv&\frac{\prod_{i=1}^n i}{\prod_{p_i\le m}p_i}\prod_{p_i\le m}(p_i-1)\\ \equiv&\prod_{i=1}^n[\lnot isp_i]i\prod_{m<p_i\le n}p_i\prod_{p_i\le m}(p_i-1)\pmod r \end{aligned}\]

\(N^1_v=\prod_{i=1}^v[\lnot isp_i]i\bmod r\)\(M^1_v=\prod_{p_i\le v}(p_i-1)\bmod r\),显然这两个数组可以在线性筛质数的同时快速计算

\(prml_v=\prod_{p_i\le v}p_i\)

答案即为 \(N^1_nM^1_m\frac{prml_n}{prml_m}\bmod r\)

发现 \(prml_n\equiv prml_m\equiv 0\pmod r\) 时会出错

因此以 \(a\times r^b\) 形式保存 \(prml\),其中 \(a\ne 0\)

因为 \(prml\) 为质数表的前缀积,因此只有 \(r\) 在质数表中时,才会令指数不为 \(0\)

此时要计算 \(\frac{prml_n}{prml_m}\),先比较两者分解的 \(b\),若不相同(实际上是 \(prml_n\) 的更大)则答案同余 \(0\),否则根据分解的 \(a\) 计算即可

时间复杂度 \(O(V+t)\),若使用埃氏筛则为 \(O(V\log\log V+t)\)

代码

T3 融合(fusion)CF878D Magic Breeding

题意

给定 \(k\) 个长为 \(n\) 的序列 \(a_{1\sim k}\)\(q\) 次操作 \(x,y\)\(a_{++k}=\min(a_x,a_y)\)\(a_{++k}=\max(a_x,a_y)\),或查询 \(a_{x,y}\)(其中的 \(\min\) 都是对于每个元素而言,即 \(a_{z,i}=\min(a_{x,i},a_{y,i})\;(1\le i\le n)\)\(\max\) 同理),\(n,q\le10^5,k\le12\)

分析

显然每个位置独立

显然最后的 \(a_{x,i}\) 一定在最开始的 \(a_{1\sim k,i}\)

对于每个 \(1\le i\le n\),将 \(a_{1\sim k,i}\) 离散化到 \(1\sim k\),记在离散化后下标为 \(1\sim k\) 的值在原本数组中的下标为 \(rk_{1\sim k,i}\)(代码中 \(a\)\(rk\) 的两维和分析中的相反)

显然最终每个 \(a_x\)(将序列看做一个整体)都可以表示为 \(\max(\min(a_{v_{1,1}},a_{v_{1,2}},\cdots),\min(a_{v_{2,1}},a_{v_{2,2}},\cdots),\cdots)\),其中任意 \(1\le v_{i,j}\le k\)

将每组 \(v_{t,X}\) 压为一个 \([0,2^k)\) 范围中的数,并对于每个数列 \(a_x\),用一个长度为 \(2^k\)std::bitset \(b_x\) 保存下所有这样的二进制数(且保存下的为所有满足条件的数,而非满足条件的一部分数)(即 \(b_x\) 为“集合的集合”)

初始 \(b_i=\{S\mid i\in S\}\)

对于 \(a_{++k}=\max(a_x,a_y)\) 的操作,令 \(b_{++k}=b_x\cup b_y\)(当 \(b_x\ge v\)\(b_y\ge v\) 有一个成立时,有 \(b_k\ge v\)

对于 \(a_{++k}=\min(a_x,a_y)\) 的操作,令 \(b_{++k}=b_x\cap b_y\)(只有当 \(b_x\ge v\)\(b_y\ge v\) 同时成立时,才有 \(b_k\ge v\)

查询一个 \(a_{x,y}\),令 \(i\)\(1\) 循环到 \(k\),每次判定 \(a_{x,y}\) 是否不小于 \(a_{rk_{i,x},y}\),如果是,则直接输出这个值并退出(因为这样是从小到大扫描,且一定在这 \(k\) 个中,因此第一个 \(\ge\) 的就是等于的)

初始 \(s\) 为空(\(s\)\([0,2^k)\) 的数),每次将 \(rk_{i,x}\) 加入 \(s\) 中,则可以证明第一个满足 \(s\in b_{x}\) 的就是第一个 \(\ge a_{rk_{i,x},y}\)

总时间复杂度 \(O\left(nk\log k+k2^k+q\left(\frac{2^k}\omega+k\right)\right)\)

代码

参考

T4 P1393 Mivik 的标题

题意

给定 \(n\)\(b_{1\sim k}\),有序列 \(a_{1\sim n}\;(1\le a_i\le m)\),满足 \(b\)\(a\) 的子段,求合法的 \(a\) 的数量取模,\(n\le 2\times10^5,k\le10^5,m\le10^9\)

分析

考虑 \(dp\)

\(f_i\;(k\le i\le n)\) 表示 \(a_{1\sim i}\) 中,\(b\) 出现且仅出现在区间 \([i-k+1,i]\) 中的方案数,则答案为 \(\sum_{i=k}^nm^{n-i}f_i\)

\(\mathcal B\)\(b\)\(border\) 集合

考虑求解 \(f_i\),有

\[f_i=m^{i-k}-\sum_{j=k}^{i-k}m^{i-k-j}f_j-\sum_{j\in\mathcal B}f_{i-k+j} \]

其中第一项为区间 \([i-k+1,i]=b\)\([1,i-k]\) 任意填,可以在循环的同时 \(O(1)\) 递推

第二项为区间 \([1,i-k]\) 中存在 \(b\) 的方案数,可以前缀和优化 \(O(1)\) 计算

第三项为 \(i\) 位置之前存在 \(b\) 且其末尾在 \([i+k-1,i-1]\) 中的方案数

按上式 暴力计算\(O(n\times |\mathcal B|)\) 的,最差可以到 \(O(nk)\)

瓶颈在于第三项,考虑优化

可以证明,可以将 \(\mathcal B\) 划分为不超过 \(\lceil\log k\rceil\) 个子集,满足每个子集中的数都可以构成等差序列,若将 \(\mathcal B\) 中的数排序,每个划分后的子集对应连续一段

因此求出划分后,对于每一段分别前缀和优化即可

时间复杂度 \(O(n\log k)\)

代码

参考

比赛结果

\(100+100+50+20\)

posted @ 2024-11-18 19:04  Hstry  阅读(11)  评论(0)    收藏  举报