eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач
Задачи

НОД Экстрим 2

опубликовано 16.03.2011, 16:23:41

This condition same as GCD extremeI..:)) but its condition must be different :))

There is " 1 < n < 200001 " in problem condition, I think it is wrong it must be 1 < n < 4000001.. (I accepted this problem )

awpris ответил:
And you look at the restrictions, including time ... :)
опубликовано 03.04.2024, 01:07:54

import java.util.Scanner;

public class Main { static final int MAX = 4000001; static long n; static long[] d = new long[MAX]; static long[] fi = new long[MAX];

static void fillEuler() {
    for (int i = 2; i < MAX; i++) fi[i] = i;

    for (int i = 2; i < MAX; i += 2) fi[i] /= 2;

    for (int i = 3; i < MAX; i += 2)
        if (fi[i] == i)
            for (int j = i; j < MAX; j += i) fi[j] -= fi[j] / i;
}

static void f() {
    int SQRT_MAX = (int) Math.sqrt(MAX);
    for (int i = 2; i <= SQRT_MAX; i++) {
        d[i * i] += i * fi[i];
        for (int j = i * i + i, k = i + 1; j < MAX; j += i, k++)
            d[j] += i * fi[k] + k * fi[i];
    }
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    fillEuler();
    System.arraycopy(fi, 0, d, 0, MAX);
    f();
    for (int i = 3; i < MAX; i++) d[i] += d[i - 1];
    while ((n = scanner.nextLong()) != 0) System.out.println(d[(int) n]);
}

}