题意简述
交互题。给定 $n$, 猜数 $x$ ($1\le x\le n$)。
交互库将维护一个集合 $S$,初始为不大于 $n$ 的所有正整数。交互库提供三个函数:
$A(a)$,返回求出 $S$ 中 $a$ 的倍数的个数 $(1\le a\le n)$。
$B(a)$,返回 $A(a)$,并将所有 $a$ 的倍数从 $S$ 中删去($x$ 不删,$a > 1$)。
$C(a)$,报告猜得的数 $x = a$。
三个函数总共可以调用不超过 $10^4$ 次。
主要思路
未特殊提及时下列 $p$ 均为素数。
显然可以通过对每个素数 $B(p)$ 后求 $A(p^k)$ 得到 $x$ 的质因数分解。
发现 $10^5$ 内的素数及其幂次就有约 $10^4$ 个,然后暴毙了。
考虑大小分素数,称不大于 $\sqrt{n}$ 的为小素数,否则为大素数。
对于小素数可以直接通过上面的暴力得到。
如果 $x$ 有小素数因子,则显然最多有一个大素数因子,枚举大素数并求 $B(p)$ 即可得知是哪个大素数。
那么现在剩下的情况只有 $x$ 为大素数的。
发现 $A(1)$ 可以得到目前集合内剩余的数。
不妨直接暴力对每个大素数删除,每 $K$ 个 $B(p)$ 做一次 $A(1)$。
如果和上次差的不是 $K$,证明 $x$ 就在刚刚删去的 $K$ 个中,每个做一次 $A(p)$ 即可。
$K$ 直接取为不大于 $\sqrt{n}$ 的素数个数即可。
参考代码
然后还写挂了一会,自己写了一个 grader……
1 |
|