[HEOI2015]公约数数列

不错的分块题

gcd和xor其实并没有联系

这里,xor的按位性质没有半点卵用

gcd的性质却很关键:

一个数组,前缀gcd最多logn个不同的

gcd不太多,(暴力的基础)

所有考虑分块。

分块,每个块维护:每个点的块内前缀gcd,块内前缀xor,每个块保存前缀所有块的gcd

修改暴力修改涉及到的信息

查询,挨个找块,lasgcd前面几个块的gcd,lasxor前面几个块的xor,

如果i块的前缀gcd==lasgcd,说明整个块内的gcd都是lasgcd。有nd=X/lasgcd^lasxor。看这个块内前缀xor有没有nd这个数。二分。复杂度sqrt(n)*logn

否则暴力进入块内寻找。gcd只有logn个不同的,所以这里复杂度总共sqrt(n)*logn

总复杂度O(nsqrt(n)logn)

随机数据的话,远远不到上界。

原文地址:https://www.cnblogs.com/Miracevin/p/10256405.html