模拟测试67
Posted hz-rockstar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟测试67相关的知识,希望对你有一定的参考价值。
T1:
求满足$(a+b)<=n$且$n|ab$的数对数。
将答案用公式表示:
$egin{array}{rl} ans &=& sum limits_{i=1}^n sum limits_{j=1}^n [i+j|ij][i+j<=n] \ &=& sum limits_{i=1}^{n-1} sum limits_{j=1}^{n-i} [i+j|ij] end{array}$
设$g=gcd(a,b)$,则当$frac{a+b}{g}|g$时,满足条件。
证明:
若$a+b|ab$,则$frac{a+b}{gcd(a,b)}|frac{ab}{gcd(a,b)}$。
设$a‘=frac{a}{gcd(a,b)},b‘=frac{b}{gcd(a,b)}$。
则$a‘+b‘|a‘b‘gcd(a,b)$。
由于$a‘$和$b‘$互质,$a‘+b‘|gcd(a,b)$。
满足条件的数对数为:
$ans=sum limits_{i=1}^{n-1} sum limits_{j=1}^{n-i} [i+j|gcd(i,j)]$
枚举gcd:
$egin{array}{rl} ans &=& sum limits_{g=1}^{sqrt{n}} sum limits_{i=1}^{lfloor frac{n}{g} floor} sum limits_{j=1}^{lfloor frac{n}{g} floor -i}[gcd(i,j)==1][i+j|g] \ &=& sum limits_{g=1}^{sqrt{n}} sum limits_{i=2}^{lfloor frac{n}{g} floor} sum limits_{j=1}^{i-1} [gcd(j,i-j)==1][i|g] end{array}$
由更相减损术可知:
$gcd(x,y)==gcd(y,x-y)$
所以:
$egin{array}{rl} ans &=& sum limits_{g=1}^{sqrt{n}} sum limits_{i=2}^{lfloor frac{n}{g} floor} [i|g] sum limits_{j=1}^{i-1} [gcd(i,j)==1] \ &=& sum limits_{g=1}^{sqrt{n}} sum limits_{i=1}^{lfloor frac{n}{g} floor} [i|g] varphi(i) \ &=& sum limits_{g=1}^sqrt{n} sum limits_{d|g} varphi(d) \ &=& sum limits_{d=1}^{sqrt{n}} lfloor frac{n}{d^2} floor varphi(d )end{array}$
线性筛出$varphi$即可。
时间复杂度$O(sqrt{n})$。
T2:
最长上升子序列问题。
用数状数组优化能达到$nlogn$的复杂度。
还需要统计方案数,在数状数组中装结构体,不断合并,求出当前点在最优状况下的方案数,然后转移。
时间复杂度$O(nlogn)$。
T3:
斐波那契数,肯定要用到斐波那契数列。
设三个数组,$dp[i]$表示斐波那契数,$f[i]$表示第$i$层的白点数,$g[i]$表示黑点数。
这三个数组都可以通过递推得到,再处理一个前缀和。
分情况讨论:
若lca为其中一个白点,直接处理子树中白点数之和,成上每层的白点数。
其他情况下lca均为黑色节点,枚举路径长度,和一个点距lca的深度,另一个点可以算出。
然后可以得知黑色节点的高度范围,乘上黑色点数即可。
时间复杂度$O(n^2)$。
以上是关于模拟测试67的主要内容,如果未能解决你的问题,请参考以下文章