英语耍够了,没法很清晰的表达思路,还是换母语比较好…
先看题目把,这个题需要求1-n的欧拉函数值,如果直接大循环来做是要超时的。
题目链接
这个题嵌套了之前的线性筛法选质数的模板,然后加上欧拉函数的公式,具体情况如下:
(图片老上传失败,我真的很忧伤)
这里的prime数组就是欧拉公式中的p1, p2, p3, …, pk
顺带一提当i % prime[j] == 0时 prime[j]就是i的最小质因子。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
static int N = 1000010;
static int prime[] = new int[N], phi[] = new int[N];
static boolean st[] = new boolean[N];
static int cnt = 0;
static long res;
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);
phi[1] = 1;
f(n);
pw.println(res);
pw.flush();
br.close();
}
public static void f(int n) {
for (int i = 2; i <= n; i++) {
if (!st[i]) {
prime[cnt++] = i;
phi[i] = i - 1;
}
for (int j = 0; prime[j] <= n / i; j++) {
st[prime[j] * i] = true;
if (i % prime[j] == 0) {
phi[prime[j] * i] = prime[j] * phi[i];
break;
} else {
phi[prime[j] * i] = phi[i] * (prime[j] - 1);
}
}
}
for (int i = 1; i <= n; i++) res += phi[i];
}
}