Description
题目链接:Codeforces 594D
今天的数学课上,老师告诉 Vovochka 正整数的欧拉函数 $\varphi(n)$ 是计算小于等于 $n$ 且与 $n$ 互质的正整数的函数,$1$ 和任意正整数互质所以 $\varphi(1)=1$。
现在老师给了 Vovochka 一个数列 $a_1,a_2,\dots,a_n$,要求回答 $q$ 个询问 $l_i,r_i$,计算 $\varphi\left(\prod_{i=l}^r a_i\right)$ 的值,答案对 $10^9 + 7$ 取模。这个问题对二年级学生来说太难了,所以你决定帮助 Vovochka。
数据范围:$1\le n,q\le 2\times 10^5$,$1\le a_i\le 10^6$
Solution
由于只有询问操作,因此我们首先想到离线后用莫队解决。但是莫队的复杂度为 $O(q\sqrt n\log a_i)$(其中 $\log a_i$ 指每个数的本质不同的质因子个数),显然无法通过本题(我卡了半个小时常数还是 $\text{TLE}$ 出题人毒瘤)。
还是考虑离线,我们将询问按照右端点排序,维护一个右指针,将每个 $a_i$ 逐个加入。用树状数组维护每个位置对答案的贡献。
我们考虑 $a_i$ 的其中一个质因子 $p$(其他的质因子同理)。由于我们把询问按照右端点排序了,而每个质因子只能对答案有一次贡献,那么我们把 $p$ 的贡献放到区间 $[1,i]$ 的最右边,即进行操作 $add(i,p-1)$ 和 $add(i,p^{-1})$。如果 $p$ 已经出现过了,那么我们需要防止区间左端点左侧产生贡献,维护一个 $lst[i]$ 表示 $i$ 这个质因子上次出现的位置,将 $lst[p]$ 位置的贡献消去即可。
对于如何快速分解每个数的质因子,我们可以根据线性筛的本质:每个数只会被其最小质因子筛去,在筛的过程中直接记录每个数的最小质因子即可!
时间复杂度:$O((n+q)\log n\log a_i)$
Code
1 |
|