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) 即可。

    正解

    咕咕咕。

  • 相关阅读:
    4.2Python数据类型(2)之布尔类型
    4.1Python数据类型(1)之数值类型
    AvalonJS+MVVM实战部分源码
    数据库的总结
    面向对象的Java实现
    静态HTML总结
    JS总结
    JSP开发Web应用系统
    使用C#开发数据库应用程序
    深入.NET平台和C#编程
  • 原文地址:https://www.cnblogs.com/JiuPleber/p/2019_fcswc_day2.html
Copyright © 2011-2022 走看看