【学习笔记】欧拉函数+因数和 的处理
有不懂的看代码。
\[\begin{matrix}
\text{Ola function:} \\
n = a_1^{k1} a_2^{k2} \cdots a_s^{ks} \\
\varphi(a^k) = a^k-a^{k-1} = a^{k-1}(a-1) \\
\varphi(n) = \prod_{i=1}^{s} \varphi(a_i^{ki}) \\
\varphi(n) = \prod_{i=1}^{s} a_i^{ki} - a_i^{ki-1} = \prod_{i=1}^{s}a_i^{ki}(1-\frac{1}{a_i}) = n \prod_{i=1}^{s}\frac{a_i-1}{a_i} \\
\text{Ola solve:} \\
\varphi(i \cdot st_j) = \varphi(i) \cdot (st_j - 1)[i \% st_j \not= 0] + \varphi(i) \cdot st_j[i \% st_j = 0] \\
\text{when: }i \%st_j=0 \\
n \gets i \cdot st_j, n' \gets i \\
\varphi(n) = n \prod_{i=1}^{s}\frac{a_i-1}{a_i} = n' \cdot st_j \prod_{i=1}^{s}\frac{a_i-1}{a_i} = \varphi(n') \cdot st_j \\
\text{The sum of facts:} \\
\text{令 i 的最小质因数为 a1,幂次为 k1} \\
\text{prime i 表示 }1+a1+ \cdots +a1^{k1} \\
\sigma(n) = \prod_{i=1}^{s} (1+ai+ \cdots +ai^{ki}) \\
\text{when }i \% j \neq 0 \text{: } \\
\sigma(i \cdot st_j) = \sigma(i) \cdot \sigma(st_j),prime(i \cdot st_j) = st_j + 1\\
\text{when }i \% j = 0 \text{: } \\
\sigma(i \cdot st_j) = \frac{\sigma(i)}{prime(i)} \cdot (prime(i) \cdot st_j + 1),prime(i \cdot st_j) = prime(i) \cdot st_j + 1
\end{matrix}
\]
void init(int n = 1e6){
phi[1] = 1, sum[1] = 1, prime[1] = 1;
for(int i = 2;i<=n;++i){
if(!prime[i]){
st[++top] = i;
phi[i] = i-1;
prime[i] = i + 1;
sum[i] = i + 1;
}
for(int j = 1;j<=top && i * st[j] <= n;++j){
if(i % st[j]){
phi[i * st[j]] = phi[i] * (st[j] - 1);
sum[i * st[j]] = sum[i] * sum[st[j]];
prime[i * st[j]] = st[j] + 1;
}else{
phi[i * st[j]] = phi[i] * st[j];
sum[i * st[j]] = sum[i] / prime[i] * (prime[i] * st[j] + 1);
prime[i * st[j]] = prime[i] * st[j] + 1;
break;
}
}
}
}

浙公网安备 33010602011771号