模拟测试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的主要内容,如果未能解决你的问题,请参考以下文章

[考试反思]1010csp-s模拟测试67:摸索

程序测试

程序测试

单元测试——使用模拟对象做交互测试

模拟测试特征和模拟方法

对于 Java 测试,我应该模拟客户端还是模拟服务器