URAL2124 - Algebra on Segment

题意

维护一个序列,支持区间乘 \(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)\),需要大力卡常。

总结

对于只涉及到乘法和乘方的维护问题,可以利用离散对数转化成加法和乘法操作。

posted @ 2023-01-05 19:42  Kevin090228  阅读(61)  评论(0)    收藏  举报