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\) 是否是质数,则答案为
令 \(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\),有
其中第一项为区间 \([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\)

浙公网安备 33010602011771号