模拟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$即可。

posted @ 2019-10-03 20:41  skyh  阅读(206)  评论(0编辑  收藏  举报