气死我了,给个 hack:
这两组数据会将“此用户已被标记为棕名”的代码卡到 O(n2)O(n^2)O(n2)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意解析:给定一个长度为 nnn 的数组 AAA。qqq 次询问,每次询问给定一个数 vvv,求有多少 l≤rl\le rl≤r 满足 gcd{Al,...,Ar}=v\gcd\{A_l,...,A_r\}=vgcd{Al ,...,Ar }=v。
首先因为一个区间的 gcd\gcdgcd 一定是它子区间 gcd\gcdgcd 的因数,所以势能分析一下,对于任意一个 lll,[l,n][l,n][l,n] 一定可以分成不超过 log2V\log_2 Vlog2 V 段,每段内区间 gcd\gcdgcd 值相同。
所以我们只需要求出所有段就可以得出所有答案了。
显然可以用 ST 表 O(nlognlogV)O(n\log n\log V)O(nlognlogV) 实现。
有人可能会说:诶你这计算 gcd\gcdgcd 不算时间复杂度吗?其实势能分析一下,对于一个数 VVV 进行 nnn 次 gcd\gcdgcd 运算,最多只会算 n+log2Vn+\log_2 Vn+log2 V 次。所以次数可以忽略不计。
Bonus:单点改,区间求。显然可以做到 O(qnlogVloglogV)O(q\sqrt{n\log V\log\log V})O(qnlogVloglogV )。