【题解】Codeforces Round 729 (Div.2) 4 of 6

A. Odd Set

Problem

题意:给出长为 \(2n\) 的数组,问是否能分成 \(n\) 个长度为 \(2\) 的组使每组内两数之和均为奇数。

若和为奇数,则两数一奇一偶,即判断原数列中奇数个数是否等于偶数个数。

B. Plus and Multiply

Problem

好题

题意:\(T\le 10^5\) 组数据,给定正整数 \(n,a,b\) ,每次能将一个数 \(\times a\)\(+b\),问是否能将 \(1\) 经过若干次操作得到 \(n\)

\(1\le n,a,b\le 10^9\)

若得到了某个数 \(x\) 满足 \((n-x)\% b=0\) 那么显然符合要求。

对于 \(+b\) 操作,\(\%b\) 后余数不变。

意味着只有 \(\times a\) 操作会使 \(\%b\) 的余数改变。

枚举不超过 \(n\)\(a\) 的次方数 \(x\) 判断是否满足 \((n-x)\%b=0\) 即可。

特判 \(a=1\) 的情况。

C. Strange Function

Problem

题意:求 \(\sum\limits_{i=1}^n f_i\)\(f_i\) 为满足 \(x\nmid i\) 的最小正整数 \(x\)

\(1\le T\le 10^4\)\(1\le n\le 10^{16}\)

没什么思路,打表得到 \(2,3,2,3,2,4,2,3,2,3,2,5,2,\dots\)

\(p_i\) 为第一次出现 \(i\) 的位置,观察有 \(p_3=2,p_4=6,p_5=12\) ,类比得 \(p_i=\text{lcm} (1\sim i-1)\)

其中每个位置贡献至少为 \(2\),故初始化 \(ans=2n\)

又若 \(i\) 在位置 \(pos\) 有贡献,则在 \(pos\) 的倍数处也必有贡献,且每次贡献为 \(1\)

而每个 \(i\)\(1\sim n\) 中出现 \(\left\lfloor\dfrac{n}{p_i}\right\rfloor\) 次,故 \(ans=2n+\sum\limits_{i=3}^{p_i\le n}\left\lfloor\dfrac{n}{p_i}\right\rfloor\) .

D. Priority Queue

Problem

题意:给定长为 \(n\) 的操作序列 \(A\) ,定义操作序列 \(B\)\(A\) 的一个子序列,并维护一个可重集 \(T\)。若操作形如 + x 则将 \(x\) 插入 \(T\),若操作形如 - 则将 \(T\) 中最小元素删去(若为空则忽略)。令 \(f(B)\) 为经过 \(B\) 的操作后 \(T\) 中剩余元素的和,求 \(\sum f(B)\)

\(1\le n \le 500\)

类计数dp,因为我们对于每一个+ x 操作只关心数 \(x\) 最终出现在多少个 \(B\) 中。因为最多有 \(n\)+ x,所以可以最多进行 \(n\) 次 dp 得到结果,每次 \(O(n^2)\),一共 \(O(n^3)\)

\(f_{i,j}\) 为前 \(i\) 个数中有 \(j\) 个数比 \(x\) 小的方案数,设当前第 \(i\) 位读到 -,比 \(x\) 大的数和比 \(x\) 小的数,由该位选或不选分类讨论写出转移方程。若 \(A[k]=x\) :

\[f_{i,j}=\begin{cases}f_{i-1,j}+f_{i-1,j+1}&,A[i]= \text{'-'}\\f_{i-1,j}+f_{i-1,j}&,A[i]>x \text{ or }A[i]=x,i>k \\f_{i-1,j}+f_{i-1,j-1}&,A[i]<x,j\neq0 \text{ or }A[i]=x,i<k\\f_{i-1,j}&,A[i]<x,j=0 \text{ or }A[i]=x,i<k\end{cases}\]

特别注意第一种情况当 \(i<k\)\(j=0\) 时需要加上 \(f_{i-1,0}\),因为此时选上 - 不会使 \(j\) 变小。


【题解】Codeforces Round 729 (Div.2) 4 of 6
https://kisuraop.github.io/posts/49b078d6.html
作者
KisuraOP
发布于
2021年7月4日
许可协议