rank4大众rank
T1 天空龙
让他自由翱翔吧
T2 巨神兵
对于n=10的测试点本可以打出非常优秀的分层状压
但是没有打出来,因为对拓扑图理解不够深刻,纠结于指回的边,实际上只关注伸出的边就可以
正解则是跟分层一点关系都没有
记录两层的状态一定要gg的,所以只记录一层
那么状态定义就不可避免地成了”保证状态是个拓扑图“
然后内部一片混沌,于是又得容斥。
假设现在我们有一个完全正确的状态$st$,也就是所有符合条件的状态都被计算一次
考虑如何转移到更庞大的一个状态$state$
由于$dp$是枚举所有状态和所有转移,所以我们可以认为$st -> state$的过程会经过所有可能的路径
将这些路径分类来达到容斥的目的
假设$size[state^st]=sz$
那么根据最后一次加入点的个数可以分成:
$1 C_{sz}^1 条$
$2 C_{sz}^2 条$
${sz} C_{sz}^{sz}条$
这种组合数的东西,我们十分套路地使用奇加偶减就行了
具体来说就是转移的时候,如果加入奇数个点则系数为1,否则系数为-1
T3
枚举最大公约数,则$ans=sum limits_d=1^n sum limits_{1<=a,b<=frac{n}{d}} [gcd(a,b)==1]$
而$n/d$只有$sqrt[2]{n}$种取值,所以先上分块
随后的东西我不会证复杂度了
$sol1$
假设a<b枚举$a<sqrt[2]{frac{n}{d}}$,变成$sumlimits_{a=1}^{frac{n}{d}} [gcd(a,frac{n}{d*a})==1]$
设$k=frac{n}{d}$,上莫比乌斯反演$sumlimits_{a=1}^k sumlimits_{t|a} u(t)$
$sumlimits_{t=1}^k u(t) sumlimits_{x=1}^{x*t<=k} 1 -phi(x*t)$
然后直接就是调和级数,时间复杂度$nlogn$, 空间复杂度根号
可以水到80
$sol2$
考虑函数$f(x)=sumlimits_{1<=a,b<=k} [a*b<=k][gcd(a,b)==1]$
发现$f(x)$比$f(x-1)$多出的部分就是$sum[a*b==k][gcd(a,b)==1]$
也就是把k拆成两部分,不含有相同的质因子
$delta=2^{d(k)}$
可以线筛,时间复杂度$n$,空间复杂度$n$
如果你能结合$sol1,sol2$,同时计算出最优复杂度分界线$n^{frac{2}{3}}$,可以直接AC
$sol3$
还是考虑那个函数,这次上容斥(又是容斥,算上明天的题都3道容斥题了)
设$g(i)=sumlimits_{1<=a,b<=k} [a*b<=k]$
枚举ab的gcd t,则重复的部分就是k中除去$t^2$之后分成两个互质的数的方案数
这不就是f自己
$f(i)=g(i)-sumlimits_{t>1} f(frac{k}{t^2})$
递归调用自己,复杂度不会证,听说是$n^{frac{2}{3}}$
然后又要玄学计算最优复杂度分界线又是$n^{frac{2}{3}}$,结合sol1可以用更快的速度AC
恰完饭再写,饿。