【学习笔记】欧拉函数+因数和 的处理

有不懂的看代码。

\[\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;
			}
		}
	}
}
posted @ 2024-10-01 21:35  Luzexxi  阅读(15)  评论(0)    收藏  举报