模拟57 题解
A. 天空龙
一个很好的性质是:最优方案可以不存在一个颜色A,转化为B再转化为C。
因为将A直接转化为C一定更优。
所以无需分类讨论,直接用一个sum判断正负就可以了。
B. 巨神兵
有向图无环,所以存在拓扑序,所以用分层图dp。
设f(i,j)表示已经考虑点集i,并且点集j在分层图的最后一层。
显然j是i的子集,转移到的状态又是i的超集。
枚举i的超集作为分层图的下一层,推一推转移系数就可以了。
用枚举子集的方法,总复杂度为$O(4^nm)$。
正解成功压掉了j一维,并用新增点的奇偶性对应1和-1作容斥系数,直接进行dp。
原因大概是,每一个分层图的不同层,被划分为了从不同的集合转移而来。
C. 太阳神
发现问题的正向比较复杂,于是考虑逆问题。
$\sum \limits_{a=1}^{n} \sum \limits_{b=1}^{n}[lcm(a,b)<=n]$
$=\sum \limits_{d=1}^{n} \sum \limits_{a=1}^{n} \sum \limits_{b=1}^{n}[\frac{ab}{d}<=n][gcd(a,b)==d]$
$=\sum \limits_{d=1}^{n} \sum \limits_{a=1}^{n/d} \sum \limits_{b=1}^{n/d}[ab<=n/d][gcd(a,b)==1]$
设$f(n)=\sum \limits_{i=1}^{n} \sum \limits_{j=1}^{n}[i*j<=n][gcd(i,j)==1]$
原式$=\sum \limits_{d=1}^{n} f(n/d)$
设$sum(n)=\sum \limits_{i=1}^n \sum \limits_{j=1}^n [i*j<=n]$
显然$sum(n)$可以用整除分块$O(\sqrt n)$求出。
那么$f(n)=sum(n)-\sum \limits_{i=2}^{\sqrt n} f(\frac{n}{i^2})$
即枚举不合法的$gcd$为什么,继续递归进行。
为了保证复杂度为$O(n^{\frac{2}{3}})$而不是$O(n^{\frac{3}{4}})$,还需要写一个线性筛出$n^{\frac{2}{3}}$以内的函数值。
不妨只考虑增量$f(i)-f(i-1)$也就是$\sum \limits_{i=1}^{n} \sum \limits_{j=1}^{n}[lcm(i,j)==n]$
设$n$有$k$个质因子,那么$f(i)-f(i-1)=2^k$,所以筛质因子个数。
在主函数中整除分块统计答案$f$即可。