数学题
众所周知,\(Broken \ Eclipse\)是永远不可能做出数学题的,永远不可能的。
\(数列\)
题意:
给定一个长度为\(n\)的数列和两个数\(a,b\),每次可以对一个数\(+a,-a,+b,-b\),求将整个数列变为\(0\)的最少操作次数,无解输出\(-1\)。
解题思路:
我们知道,要想一个数通过以上操作变为\(0\),前提得是\(ax+by=A_i\)有解,根据裴蜀定理,若\(A_i \ mod\ gcd(i,j) \ne 0\),该方程无解。
所以现在剩下的就是如何才能使\(|x|+|y|\)最小。
我们设\(a<b\),容易发现此时\(x,y\)的通解是\(x+kb\)和\(y-ka\)(严格来说是\(x+\frac{kb}{gcd(a,b)}\)和\(y-\frac{ka}{gcd(a,b)}\),但这里肯定\(a\)和\(b\)都不能拆,不讨论)。假设此时\(x>0,y>0\),显然随着\(k\)的增大\(|x|+|y|\)每次都要加上\(b-a\),是越来越大的,而\(x>0,y<0\)时稍微推算一下发现也为如此,所以此时我们就应该让\(x\)尽量小,即此时我们应该要一个\(x\)的最小正整数解(或者\(0\))。当然还有\(x<0\)的情况,此时我们应该要的是一个\(x\)的最大负整数解,两个情况取一下\(min\)即可。(其实两种情况哪个更优是可以用式子判断的,但为了方便还是直接取\(min\)吧)
每个\(A_i\)都是独立的,我们分别对其搞一下\(exgcd\)就好了。
哈哈,题库里好像没有无解的测试点呢
\(树上竞技\)
题意:
一棵有\(n\)个节点的树,从其中选择\(m\)个节点作为特殊点,再选定一个点作为集合点使所有节点到这个点的距离和相较于其他点为最小,求出所有情况的最小距离和并对\(1e9+7\)取模。
解题思路:
显然是暴力......
\(“但是我拒绝。”\)
好吧,我们尝试用数学的角度思考这道题。
如果我们只考虑每一条边,假设一条边的两端分别有\(k\)和\(m-k\)个特殊点,且\(k<=m-k\),那么让点数为\(k\)的这一端去跑这条边所产生的距离花费一定会比\(m-k\)那一端要少,那么再考虑到所有的情况,于是就有(\(s\)表示\(siz_v\)):
于是我们就可以以将近\(O(nm)\)的复杂度水过\(80pts\)的分数啦。
\(“但是我拒绝。”\)
好吧,我们尝试化简一下式子。
观察下式:
实际上\(min(k,m-k)\)是可以通过\(m-1\)的奇偶性给判掉的,设\(p=(m-1)/2\),化为:
所以现在重点就变成了怎么快速求这玩意儿:
\(发现它的组合意义是n-1个物品里选择了m-1个,前面s-1个选择了k-1个的方案数\)
\(WintersRain\)大佬说得好!(鼓掌
那么如何递推\(g(s)\)呢?
\(假如说我们没有选择s作为选中的第k个点,那么前s个点选择k-1个点与前s-1个点选择k-1个点实际上是等价的。 \\ 所以此时必须让s作为第k个点。\)
初始化\(g(1)=\binom{n-1}{m-1}\),于是乎:
然后这道题基本上就没什么了。
注意要特判\(p\)是否为\(0\)。

浙公网安备 33010602011771号