专栏文章
题解:P12541 [APIO2025] Hack!
P12541题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip92670
- 此快照首次捕获于
- 2025/12/03 08:09 3 个月前
- 此快照最后确认于
- 2025/12/03 08:09 3 个月前
我们先试图找到一个 的倍数 。由于可以通过直接询问 来判定一个数 是否是 的倍数,所以已知 求 可以在 的代价内完成。
有一个显然的性质: 中一定存在一个 的倍数。
于是考虑在这个区间内二分。考虑如何检查区间 内是否存在 的倍数。
取 。
考虑询问集合 。
(放个代码可能好理解一些)
CPPbool chk(int l,int r){
int b=sqrt(r-l+1);
vector<int> a;
for(int i=1;i<=b;i++) a.push_back(i);
for(int i=b+l;i<r+1;i+=b) a.push_back(i);
a.push_back(r+1);
return collisions(a);
}
正确性证明:显然对于所有 ,一定存在 。对于 ,设 ,可以发现,若 ,则 。而若 中存在 的倍数,则 中必然存在 的倍数。于是, 中会发生哈希冲突等价于 中存在 的倍数。
这样,一次检查 的代价就是 。
记 ,总代价即为 ,
化简得 。实测总代价是 左右。
题外话:作者赛时没有发现开头那个显然的性质,于是对着 二分,代价要乘上 , 分遗憾离场。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...