Перепишемо вказану суму наступним чином:
Згрупуємо доданки в сумі за спільним множником:
У всіх доданках присутній один і той самий множник. Винесемо його за дужки:
Реалізуємо решето, яке обчислить всі значення функції Ейлера від до 10^4 і збереже їх у масиві . Потім побудуємо масив часткових сум , де
Після цього для кожного вхідного значення виведемо добуток
Приклад
Розглянемо стан масиву значень функції Ейлера та масиву часткових сум :
Для n = 10 відповідь дорівнює
Реалізація алгоритму
Оголосимо робочі масиви та , де
fi[i] = φ(i);
sum[i] = φ(1) + φ(2) + ... φ(i)
#define MAX 10001
long long fi[MAX], sum[MAX];Функція FillEuler заповнює масив значеннями функції Ейлера:
void FillEuler(void)
{
int i, j;
for (i = 0; i \u003c MAX; i++) fi[i] = i;
for (i = 2; i \u003c MAX; i++)
if (fi[i] == i)
for (j = i; j \u003c MAX; j += i)
fi[j] -= fi[j] / i;Обчислюємо часткові суми . Ініціалізуємо перші елементи масиву.
sum[0] = 0; sum[1] = 1;Потім послідовно обчислюємо решту часткових сум.
for(i = 2; i \u003c MAX; i++)
sum[i] = sum[i-1] + fi[i];
}Основна частина програми. Заповнюємо масиви та .
FillEuler();Обробляємо тестів.
scanf("%d",\u0026tests);
while(tests--)
{
scanf("%d",\u0026n);Для кожного вхідного значення обчислюємо і виводимо відповідь
res = sum[n] * sum[n];
printf("%lld\n",res);
}