关键词
题目
定义 F(i) 表示 1 \backsim i 中与 i 互质的数的个数,现给定一个正整数 N,请你求出 \sum_2^NF(i)。
输入描述
第1行为一个整数 T,表示测试数据数量。
接下来的 T 行每行包含一个正整数 N。
1 \leq T \leq 10^5, 1 \leq N \leq 10^7。
输出描述
疏忽共 T 行,每行包含一个整数,表示答案。
示例
输入
5
1
2
3
4
5
输出
1
2
4
6
10
知识点1
-
欧拉函数
欧拉函数
\varphi(n)(n \in N^*)是小于等于n的正整数中与n互质的数的个数。 -
欧拉定理
对于任意互素的
a和n,有a^{\varphi(n)} \equiv 1 (\mod n) -
欧拉函数求法
\varphi(1) = 1。 如果n是质数, 则\varphi(n) = n - 1。 如果n = p^k(p 为质数,k \in N^*),则 $\varphi(p^k) = p^k - p^{k-1}$。 如果n = p \cdot q,而且p, q互质,有\varphi(n) = \varphi(p \cdot q) = \varphi(p) \cdot \varphi (q)通式:\varphi(n) = n \displaystyle \sum_{i=1}^r(1 - \frac{1}{p_i} ),其中n = p_1^{k_1} \cdot p_2^{k_2} ... p_r^{k_r}(p_1, ..., p_r都为质数)
解决方案
通式求欧拉数
int Euler(int n){
if (n <= 1) return 0;
int ret = n;
int s = (int) sqrt(n);
for (int i=2; i <= s; i++){
if (n % i == 0){
ret = ret - ret / i;
while (n % i == 0) {
n = n / i;
}
}
}
if (n > 1) ret = ret - ret /n;
return ret;
}
注:此算法仅为求解欧拉数的简便算法,并不保证是此题的最优算法