A:
考虑随便取一个数 v,用一次询问问出 t=loggv。
我们希望找到一个 x 使得 vx≡g(modp),也即 gtx≡g(modp)⟺tx≡1(modp−1)。于是,我们希望找到的 v 使得 t 与 p−1 互质即可。
由原根的相关知识我们知道,这样的 v 就是 (modp) 意义下的原根。于是找到 (modp) 意义下的最小原根后,即可在一次询问内解决问题。
B:
没改。
C:
边分治。
假设我们现在钦定了一条边,那么这条边一定将图划分为两部分,而且从一部分中的点 a 到另一部分中的点 b 一定经过这条边的端点之一。
设两端点为 l,r,那么 disa,b=min(disa,l+disl,b,disa,r+disr,b),而 au+av≤bu+bv⟺au−bu≤bv−av,排一遍序即可统计跨过这条边的答案。
考虑每次找到左右两部分边数最接近的边,不断分治即可,时间复杂度为 O(nlog2n)。