模拟107 题解

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)$。

实际上第二维并没有用,因为只关注奇偶性来进行容斥操作,所以直接压掉第二维就好了。

posted @ 2019-11-10 07:07  skyh  阅读(199)  评论(0编辑  收藏  举报