FCS冬令营 Day2

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

A

题目描述

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

数据范围

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

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

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

\[\frac{(n-1)*n}{2} , n\in\mathbb {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\) 即可。

正解

咕咕咕。

posted @ 2019-02-13 22:29  臼邦庶民  阅读(165)  评论(0编辑  收藏  举报