模拟测试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)$。

posted @ 2019-10-14 09:59  hz_Rockstar  阅读(209)  评论(0编辑  收藏  举报