模拟测试67
T1:
求满足$(a+b)<=n$且$n|ab$的数对数。
将答案用公式表示:
$\begin{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:
$\begin{array}{rl} ans &=& \sum \limits_{g=1}^{\sqrt{n}} \sum \limits_{i=1}^{\lfloor \frac{n}{g} \rfloor} \sum \limits_{j=1}^{\lfloor \frac{n}{g} \rfloor -i}[gcd(i,j)==1][i+j|g] \\ &=& \sum \limits_{g=1}^{\sqrt{n}} \sum \limits_{i=2}^{\lfloor \frac{n}{g} \rfloor} \sum \limits_{j=1}^{i-1} [gcd(j,i-j)==1][i|g] \end{array}$
由更相减损术可知:
$gcd(x,y)==gcd(y,x-y)$
所以:
$\begin{array}{rl} ans &=& \sum \limits_{g=1}^{\sqrt{n}} \sum \limits_{i=2}^{\lfloor \frac{n}{g} \rfloor} [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} \rfloor} [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}\rfloor \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)$。