<span>模拟107 题解</span>
A. 字符交换
枚举最终出现的字符,那么答案具有单调性。
之后枚举相同字符的起点,可以计算出终点。
最优策略显然是换到中间的字符旁边,所以用前缀和维护一下就完了。
B. 平方数
考虑怎样的两个数相乘可以构成平方数:
将两个数分别质因数分解,如果二者奇数的质因子集合相同,那么可以构成。
所以可以用哈希表压奇数质因子集合。
然而比较难处理的是质因数分解,暴力根号筛会$TLE$。
这时可以考虑利用本题的特殊性质,即只需要筛出平方质因子,剩下的自然是奇数质因子集合。
一个$O(a_i^{\frac{1}{3}})$的筛法是,
枚举质数直到$a_i^{\frac{1}{3}}$大小,将平方因子直接除掉,将剩余的奇数质因子提出。
最后特判筛后剩余的结果,如果是平方数,那么将它除掉。
提出的质因子乘最终筛剩余的数,即要求的奇数质因子集合。
可以证明上述的筛法是正确的:
设最后筛剩下的数为$x$,如果仍然含有平方质因子,那么
$x$一定可以表示为$x=k*p^2$ $(p>x^{\frac{1}{3}})$。
那么$k<x^{\frac{1}{3}}$,所以$k$只能为$1$,
因为特判了最终的$x$为平方数,正确性得证。
C. 多维网络
直接用排列组合,可以得出在没有坏点的情况下,两点之间的路径数。
所以考虑用奇加偶减的容斥处理这个问题。
显然坏点之间存在一个拓扑序,即按维排序。
设$dp_{i,j}$表示到第$i$个坏点,总共经过了$j$个坏点的方案数。
可以进行显然的$dp$转移,然而这样做的复杂度是$O(n^3d)$。
实际上第二维并没有用,因为只关注奇偶性来进行容斥操作,所以直接压掉第二维就好了。