zoukankan      html  css  js  c++  java
  • 2020中国大学生程序设计竞赛(CCPC)-网络选拔赛 题解

    1001

    1002

    题意:给定一个n个点的完全图,边权为lcm(i+1,j+1),求最小生成树。

    考虑这样一个构造方法

    所有数字都向自身的最小质因数连边

    这样可以保证每个数字的贡献都是其本身,达到了理论最小。(lcm一定比自己本身要大)

    然后就有了k棵以质数为根的树

    然后考虑连接这k棵树

    显然质数之间的lcm就是它们的乘积

    所以所有根都和2连边即可

    考虑计算答案

    (tot)为2到n+1的所有素数的和

    [egin{align*} ans&=2*(tot-2)-tot+sum_{i=2}^{n+1} i \ &=tot - 4+sum_{i=2}^{n+1} i \ &=tot+frac{n^2+3n-8}{2} \ end{align*} ]

    考虑如何计算tot

    这是一个min25模板题,不再赘述

    实际上,也可以通过分块打表的方法通过此题。

    1003

    签到题

    显然最后一个用距离出口最近的即可。

    1007

    题意:给出一个字符串,将其重新排列,使得该字符串的border最大

    比较显然的构造是出现次数最多的字母全部放在开头,然后border就是该字母出现的次数

    由border的简单性质可知答案不可能比这个大,因此具有正确性

    1010

    签到题

    按照题意模拟即可

    1013

    题意:给定一个多项式,操作n-1次。第k次操作为令(f(x)=B_k*f'(x)+C_k*f(x))。求操作n-1次后的多项式。

    考虑算贡献

    显然原多项式的高次项会对最终答案的低次项产生贡献

    考虑怎么算xk对xi的贡献

    首先贡献系数的话

    如果(bk=ck=1)的话显然就是一个NE-Latice-Path问题

    贡献系数也就是一个组合数

    既然有了系数

    那么只需要模拟NE-Latice-Path的计算过程

    设一个生成函数#h_k(x)=B_k*x+C_k

    把这n-1个单项式乘起来即可得到关于贡献系数的多项式

    这一步需要通过类似线段树分治的分治NTT实现

    这里一定要注意写的常数小一些

    不要采取封装多项式的写法

    这里我采用了类似

    除此之外还要考虑求导本身产生的系数

    简单推导发现(x^k)(x^i)产生的贡献是(frac{k!}{i!})

    整理一下

    设:

    最终多项式的系数为(f_k)

    求导k次的贡献系数为(g_k)

    [egin{align*} f_i&=sum_{k=i}^n g_{k-i}*a_k*frac{k!}{i!} \ f_i*i!&=sum_{k=i}^n g_{k-i}*a_k*k! \ end{align*} ]

    发现这是一个下标差为定值的的卷积

    是一个经典套路题

    翻转数组后即可转化为正常形式的卷积

    大力NTT即可

    总复杂度(O(nlog^2n))

  • 相关阅读:
    Python2.7-math, cmath
    Python2.7-pprint
    Python2.7-copy
    Python2.7-weakref
    Python2.7-Queue
    Python2.7-sched
    Python2.7-array
    Python2.7-bisect
    搜索专题:Balloons
    【洛谷P4460】解锁屏幕【状压dp】
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/13705057.html
Copyright © 2011-2022 走看看