A #
输出即可。
B #
红色的和要尽量大而且个数要尽量小,所以排序之后红色的是一段后缀、蓝色是一段前缀而且长度比红色大 1。枚举红色的个数即可。
C #
由于,所以最多有 15 个阶乘数,我们可以枚举每个阶乘是否被用,然后剩下的数计算其二进制表示中 1 的个数。记得 n 是long long
,所以要用__builtin_popcountll()
。
D #
除了 n=2 的情况,两个 good 节点就不能相邻的,所以问题就转化成了树上最大独立集问题,用树上 dp 可以轻松解决: 代表 的子树中最大独立集,其中 choose 为 0 或 1 代表 u 是否在独立集当中,转移为:
dp_{u,0}&=\sum_{v\in child(u)}\max(dp_{v, 0}, dp_{v, 1})\\\ dp_{u, 1}&=\sum_{v\in child(u)}dp_{v, 0} \end{aligned}$$ 当然这个题还要最小化点权之和,所以还要记录$cost_{u, i}$在当$dp_{u,0}=dp_{u, 1}$的时候用。还要输出方案所以还得记录每个节点的儿子选或不选。 [代码](https://codeforces.com/contest/1646/submission/148403850) ## E 重复的数只会发生在一个数以及它的幂中,所以我们每次处理一个数和它的所有幂,典型的容斥问题。 [代码](https://codeforces.com/contest/1646/submission/148397426) 大佬的 polylog 复杂度[解法](https://codeforces.com/contest/1646/submission/148397426),n 可以到$10^{15}$。(还没时间仔细研究)