Codeforces Round 836 (Div. 2) solution
__vector__
·
·
个人记录
A
正着来一遍,再倒着来一遍。
B
$n$ 是偶数:考虑最简单的 $n=2$ 的情况,此时答案是 $2,6$,然后,考虑偶数个数字异或和为 $0$,那么只需要前 $n-2$ 个填 $3$,最后两个填 $2,6$ 就可以。
### C
坑点:直接匹配是错误的。
考虑从弱化版入手,不考虑 $a_1 = x$ 的限制。
那么对于 $i \in [2,n-1]$,$a_i = i$。
那么考虑现在的问题,对 $[2,n-1]$ 分配数字。
$[2,n-1]$ 可选的数字原来是 $2,3,\cdots,n-1$,加上 $a_1 = x$ 的限制后,可选数字失去了 $x$,加入了 $n$。
也就是说,如果其他位置保持不变,那么现在 $a_x = n$。
作一个猜测:有解当且仅当 $x | n$。
首先,$x$ 能整除 $n$ 时显然有解。
如果不能整除的话, $x$ 就需要其倍数去递补,但最后总有一个数不可递补。
如果有解,简单的设置 $a_x = n$ 可能不是最优的。
考虑 $x$ 与其最近的,能整除 $n$ 且是 $x$ 倍数的位置进行交换,反复进行,直到不存在可交换的小于 $n$ 的位置。
维护这个操作,只需要每次交换时计算 $\frac{n}{x}$,求这个东西的最小质因数 $y$,然后 $x$ 与 $xy$ 交换就可以。
每个数的最小质因数可以用筛素数同样原理的方法求出来。
### D
如果数列最小值,最大值已经确定,那么设数列能得到的出来的最小总和为 $x$,最大总和为 $y$,那么这个序列能表示出 $[x,y]$ 之间的所有总和。
根据上述,如果固定了极差,那么可以二分求合法的数列最小值。
猜个结论,只要极差够大,一定能存在一组合法解。
这里取极差为 $5n$,实测可以通过。