「CF594D」REQ

Description

Link:CF594D

给出一个长度为 nn 的数组 aa

QQ 次查询,每次查询给出两个正整数 l,rl, r (1lrn1 \leq l \leq r \leq n),你需要求出

φ(i=lrai)\varphi \left( \prod_{i = l}^{r} a_i \right)

答案对 109+710^9 + 7 取模。

数据范围:1n,Q2×1051 \leq n, Q \leq 2 \times 10^51ai1061 \leq a_i \leq 10^61lrn1 \leq l \leq r \leq n

时空限制:33s / 256256MiB。

Solution

对于一个质数 pp,若 pp 是区间 [l,r][l, r] 中某个数的因数,则欧拉函数还要再乘上 p1p\frac{p - 1}{p}。而 10610^6 以内,一个数最多只有 77 个质因数。于是我们要数出区间 [l,r][l, r] 中作为因数出现的质数 pp 所带来的影响。

一开始写了一个简单的莫队,可惜 TLE 了。

考虑扫描线,将所有的询问 l,rl, r 按照右端点 rr 从小到大排序。对于一个质数 pp,设其在区间 [1,r][1, r] 中最后一个作为因数出现的位置为 xx,则只要左端点 lxl \leq x,答案就需要乘上 p1p\frac{p - 1}{p}

于是我们p1p\frac{p - 1}{p} 的贡献挂在位置 xx,询问区间 [l,r][l, r] 只需求出区间 [l,r][l, r] 的贡献之积即可。使用树状数组维护(树状数组也是可以求前缀积的)。