题目链接:Codeforces Round #538 (Div. 2) - Problem F
# 描述
You are given an array $a_1, a_2, \ldots, a_n$.
You need to perform $q$ queries of the following two types:
"MULTIPLY l r x"
— for every $i$ ($l \le i \le r$) multiply $a_i$ by $x$."TOTIENT l r"
— print$\varphi(\prod \limits_{i=l}^{r} a_i)$ taken modulo $10^9+7$, where $\varphi$ denotes Euler’s totient function. The Euler’s totient function of a positive integer $n$ (denoted as $\varphi(n)$) is the number of integers $x$ ($1 \le x \le n$) such that $\gcd(n,x) = 1$
# Input
The first line contains two integers $n$ and $q$ ($1 \le n \le 4 \cdot 10^5$, $1 \le q \le 2 \cdot 10^5$) — the number of elements in array $a$ and the number of queries.
The second line contains $n$ integers $a_1, a_2, \ldots, a_n$ ($1 \le a_i \le 300$) — the elements of array $a$.
Then $q$ lines follow, describing queries in the format given in the statement.
"MULTIPLY l r x"
($1 \le l \le r \le n$, $1 \le x \le 300$) — denotes a multiplication query.
"TOTIENT l r"
($1 \le l \le r \le n$) — denotes a query on the value of Euler’s totient function.
It is guaranteed that there is at least one "TOTIENT"
query.
# Output
For each "TOTIENT"
query, print the answer to it.
# Example
Input
4 4
5 9 1 2
TOTIENT 3 3
TOTIENT 3 4
MULTIPLY 4 4 3
TOTIENT 4 4
Output
1
1
2
# Note
In the first example, $\varphi(1) = 1$ for the first query, $\varphi(2) = 1$ for the second query and $\varphi(6) = 2$ for the third one.
# 思路
首先我们知道:若 $n = \prod\limits_{i = 1} ^ r p_i^{k_i}$,则 $\varphi(n) = \prod\limits_{i = 1} ^ r p_i ^ {k_i - 1} (p_i - 1) = n \prod\limits_{p | n}(1 - \frac{1}{p})$。其中 $p$ 是质数。
方法一:根据最后的式子,我们只需要维护两个量:区间的乘积、区间的质因子。这可以分别使用两个线段树来维护和合并信息。由于 $300$ 内一共有 $62$ 个质数(打表可知),所以可以使用
long long
来压状态。然后就是正常的线段树打标记没什么好说的了。方法二:根据前面一个式子,我们可以分别维护每个质因子的个数来计算其对答案的贡献。这样需要开 $62$ 个线段树,妥妥MLE。 由于每个质因子是独立的,所以我们可以考虑将所有操作离线,分别处理每个质因子,这样就只需要开一个了。但是由于种种原因(似乎是线段树的常数太大),我是用两个树状数组完成区间加和查询区间和的。
# 代码
# 方法一
|
|
# 方法二
|
|