LG-P9118 [春季测试 2023] 幂次 Solution

更好的阅读体验戳此进入

游记戳此进入

题面

给定 nk,求在 [1,n] 中有多少数可以表示为 ab,其中 bk

Solution

感觉差不多是绿题的难度,不卡精度的话应该算黄题难度,赛时的阴间思路在游记里了,这里说一下正解。

不难发现对于任意的合法的 b,一定满足 akn,则对于 k3 的情况,a 最大也是在 106 的范围,那么我们直接枚举所有的 a,并枚举其所有合法的 ab,然后将其全部丢到 unordered_set 里,最后直接输出其 size() 即可,考虑这样的复杂度,显然枚举 aO(n1k) 的,枚举幂次是 O(logn) 的,则复杂度 O(n1klogn),对于 k3 的情况是随便过的。

考虑对于 k=2 的情况,不难发现这东西也是很显然的,枚举一下 unordered_set 中的所有数,若其为完全平方数的话贡献 1,然后最后在答案中加上 n 即可。不难发现此时复杂度为 O(n13logn),可以通过。

同时不难发现对于 n,这个东西如果直接朴素的用 doublesqrt() 函数的话会丢失精度,所以此时需考虑使用二分或 long double__float128,前者会多一个 log,对于上述 k=2 的理论复杂度也是正确的。而用 __float128 会多一个十分巨大的甚至高于 log 的常数,不建议使用。当然我们也可以朴素地使用 sqrt() 然后取其返回值一段较小的邻域进行验证,一般 ±1 就够用了。

Code

UPD

update-2023_03_06 初稿