题意
维护一个序列,支持区间乘 \(x\),和查询区间的 \(Span\) 的大小。一个集合的 \(Span\) 定义为可以表示成其中若干可重复整数的乘积的数的集合。所有计算在模 \(p\) 意义下进行。
经典技巧
我们可以利用离散对数将每个 \(x\) 表示成 \(g^a\) 的形式,此时可以将乘法转化为加法。容易发现,\(Span(l,r)=\frac{p-1}{gcd(a_l,a_{l+1},\cdots,a_r,p-1)}\)。
离散对数
本题中因为要多次查询离散对数,即 BSGS 的复杂度为 \(O(\frac{p}{B}+(n+q)B)\),此时取 \(B=\sqrt{(n+q)p}\) 为最优。
维护序列
为了查询区间 gcd 值,我们可以考虑将序列差分,此时变成单点修改,利用线段树即可完成。
时间复杂度
时间复杂度为 \(O(\sqrt{p(n+q)}+(n+q)\log^2 n)\),需要大力卡常。
总结
对于只涉及到乘法和乘方的维护问题,可以利用离散对数转化成加法和乘法操作。
标签:Span,URAL2124,复杂度,Algebra,查询,离散,对数,Segment,乘法 From: https://www.cnblogs.com/Kevin090228/p/17028718.html