zoukankan      html  css  js  c++  java
  • FCS冬令营 Day2

    今天是个练习场,貌似没有讲算法呢。

    A

    题目描述

    构造一个恰有 $ k $ 个直径的树。可以证明,在给定的限制下一定有解。

    数据范围

    (k leq 5*10^7),构造的树的大小 (n leq 5000)

    看起来假但是可以过的做法

    考虑建一棵边权全部一样的菊花树,显然,这棵菊花的直径个数为(设有n个叶子):

    [frac{(n-1)*n}{2} , ninmathbb {N_+} ]

    那么这样,我们可以轻松解决 (sqrt{8k+1}) 为整数的情况,但是还不够。
    我们可以考虑复杂一点的构造,将原菊花树的每棵子树(它原来是个节点)也造成菊花树,设第 (i) 棵子树的叶子节点个数为 (a_i)
    我们逐个地考虑可能出现(可能有用)的情况:
    当大菊花树(我们姑且这么叫它)只有一棵子树的时候,这时要注意不能让这棵子树内出现新的直径,要保证字数内边的权值相等且足够小。这时直径的条数是 (k=n-2) ,对于太大的k,这种构造方法失效。
    当大菊花树有两棵子树的时候,这时两棵子树的叶子节点两两组合成为新的直径。这时直径的条数是 (k=a_1*a_2) 。注意到 (k leq 5*10^7) 也就是 (sqrt{k} < 2500) 。那么我们即可以凑出一个接近甚至等于 (k)(a_1*a_2),但是还差了那么一点,这种方法对于大质数的k完全无效。
    当大菊花树有三棵子树的时候,前两棵子树的叶子节点两两组合成为直径,最后一棵子树的叶子节点同前两棵子树的叶子节点结合成为直径,这时直径的条数是 (k=a_1*a_2+(a_1+a_2)*a_3),这时我们就震惊了!我们可以凑出一个很大的 (a_1*a_2) 然后用 ((a_1+a_2)*a_3) 去填补这个空余。不知为何可以证明(我也不知道能不能证明可能是因为数据水)总是存在一组 (a_1,a_2) ,可以找到对应的 (a_3) 使得 (k=a_1*a_2+(a_1+a_2)*a_3) 。有了这个结论,我们大胆枚举 (a_1,a_2) ,用它们计算 (a_3) 即可。

    正解

    咕咕咕。

  • 相关阅读:
    代码演示C#各版本新功能
    有关taro的路由的问题
    优秀的基于VUE移动端UI框架合集
    前端开发应该关注的前沿技术
    let与const的区别
    vue2.0 watch里面的 deep和immediate作用
    Flink MiniCluster 启动流程
    Windows把执行命令值赋值给变量
    Ubuntu时间比正常时间多8小时,设置重启以后时间又多8小时解决办法
    Windows下使用命令实现类似awk命令
  • 原文地址:https://www.cnblogs.com/JiuPleber/p/2019_fcswc_day2.html
Copyright © 2011-2022 走看看