Atcoder ABC400 题解
ABC400
A
查看一下 \(a\) 是不是 \(400\) 的因数即可,是就输出 \(\frac{400}{a}\),否则输出 inf。
B
一个个幂累加,一旦超出 \(10^9\) 就 break,免得爆 long long。
安全起见,我开了 __int128。
C
我们从小到大枚举 \(a\),如果存在一个 \(b\),就一定有 \(b^2 \le \frac{n}{2^a}\)。于是满足条件的 \(b\) 有 \(\sqrt{\frac{n}{2^a}}\) 个。
但是,如果这个 \(b\) 是 \(2\) 的倍数,这个数会在更小的 \(a\) 被统计到。
我们钦定 \(b\) 为奇数,于是对于一个 \(a\),满足条件的数就是 \(\left \lceil \frac{\sqrt{\frac{n}{2^a}}}{2} \right \rceil\) 个。求和即可。
submission.
注意要手写 sqrt,否则会有精度误差。
另外,这题也可以直接 $ \left \lfloor \sqrt{\frac{N}{4}} \right \rfloor + \left \lfloor \sqrt{\frac{N}{2}} \right \rfloor$。
D
对于每个点,向各个方向都可以踹一步,故向各个方向的 \(1\) 或 \(2\) 步连权为 \(1\) 的边。
对于每个点,向各个方向的 . 连权为 \(0\) 的边,代表当前格子被踹成路或本来就是路,可以花费 \(0\) 的代价走。
然后 01BFS 或 Dijkstra 就行。我有 Dijkstra 板子,故粘之。
E
既然是需要偶次方乘积,不妨先开根号,这时就没有偶次方的限制了。
此时好数的范围要求在 \(\sqrt N \le 10^6\) 以内。
只需要预处理 \([1, 10^6]\) 以内的答案就行。
先用埃氏筛弄出每个数有几种质因数,再在质因数种数为 \(2\) 的数中弄个前缀 \(\max\) 就行。
F
?
G
补。
我们做一个充分性转化,转化成:
对于每个 \(i\),要从 \(x_i,y_i,z_i\) 中任选一个,满足选 \(x\) 的个数、选 \(y\) 的个数、选 \(z\) 的个数均为偶数。求最后的总和最大值。
我们发现,这样即便会统计到一些错的方案,但是答案也一定是这个问题的最优。
考虑 easy version,即不管偶数的限制。显然按照 \(\max(x_i, y_i, z_i)\) 降序排列,取前 \(2k\) 个即可。
如果管偶数的限制呢?直观感受是,前 \(2k\) 个里面只会有 eps 个不被选到。(注意力该多么惊人才能注意到!)
这个 eps 等于 \(3\)。下证:
若前 \(2k\) 里有 \(4\) 个没被选到,根据抽屉原理,这 \(4\) 个至少有两个选 \(x\),或两个选 \(y\),或两个选 \(z\)。同理,后 \(n-2k\) 个也会有 \(4\) 个选了的,至少有选了两个相同的。这两个在前 \(2k\) 之外选的,如果被替换到 \(2k\) 之内的那两个,不会改变奇偶性的同时,也会使总和更优。
(严谨性有待杜爹确认)
于是可以 DP 了。设 \(f_{i, j, S}\) 表示考虑到前 \(i\) 个,有 \(j\) 个没选,集合 \(S\) 的第 \(0\) 位为奇就表示选 \(x\) 的个数是奇数,等等;设 \(g_{i, j, S}\) 表示考虑到 \([i, n]\),有 \(j\) 个选了,集合 \(S\) 同理。
转移是平凡的。

浙公网安备 33010602011771号