模拟65 题解
A. Simple
首先求出n,m的gcd,那么显然只有gcd的倍数可能被拼出,其他数一定是不好的数。
所以问题转化为用$\frac{n}{gcd}$,$\frac{m}{gcd}$,拼不出的$\frac{q}{gcd}$范围内的数。
因为除gcd后的n,m互质,
用某凯的疑惑中的结论可知最大的拼不出的数是$n*m-n-m$。
所以给$n*m-n-m$不断减掉n或m,一定仍然为拼不出的数。
然后就可以发现,题目中给出n的范围恰好不大。
所以给上述的数不断减m,并除n求出有多少个数就可以了。
B. Walk
打了一个非常奇怪的点分治,大概是利用了对一条边取gcd之后的不同值不会有太多。
开了很多个$vector$,并暴力扫$vector$更新答案,随机极限数据跑不到1s,得到了70分。
正解利用了边权的因数个数不超过根号级别。
所以枚举答案的大小,并只将边权有该因数的边建出来。
于是问题转化为了求建边形成的森林中最大的树的直径,直接dfs就可以了。
C. Travel
将问题中的相邻点作为一条线段。
首先考虑起点为1,终点为n的答案。
那么每条线段都会覆盖至少一次,
因为要向左跳,至少L条线段上的路径是-->,<--,-->,会覆盖至少三次。
并且存在一种方案构造出L条线段覆盖三次。
取得最小的L条线段,就可以累计答案。
当起点和终点并不为端点,不妨设$1<s<t<n$。
那么起点左侧的线段至少被覆盖两次,终点右侧的线段至少被覆盖两次。
显然对于s,t中间的答案贡献,向左跳次数越小越优,所以让两侧的线段尽可能向左跳。
使右端点单调,就可以用小根堆维护。