题解:P12541 [APIO2025] Hack!
lichenghan · · 题解
我们先试图找到一个
有一个显然的性质:
于是考虑在这个区间内二分。考虑如何检查区间
取
考虑询问集合
(放个代码可能好理解一些)
bool 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);
}
正确性证明:
显然对于所有
x\in[l,r] ,一定存在a,b\in S,|a-b|=x 。对于
a,b\in S ,设d=|a-b| ,可以发现,若
d\notin [l,r] ,则d\in[1,r-l+1] 。而若
[1,r-l+1] 中存在n 的倍数,则[l,r] 中必然存在n 的倍数。于是,
S 中会发生哈希冲突等价于[l,r] 中存在n 的倍数。
这样,一次检查
记
化简得
题外话:作者赛时没有发现开头那个显然的性质,于是对着