Göstərilən cəmini aşağıdakı kimi yenidən yazaq:
cəmindəki hədləri ümumi vuruğa görə qruplaşdıraq:
Bütün hədlərdə eyni vuruq iştirak edir. Onu mötərizədən kənara çıxaraq:
Əvvəlcə -dən 10^4-ə qədər olan bütün dəyərlər üçün Eyler funksiyasını hesablayan ələk qurub nəticələri massivində saxlayaq. Sonra qismi cəmlər massivi qurulsun, burada
Bundan sonra hər giriş dəyəri üçün
hasilini çap edək.
Misal
Eyler funksiyasının dəyərlər massivi və qismi cəmlər massivi -ın vəziyyətinə baxaq:
n = 10 üçün cavab bərabərdir:
Alqoritmin realizasiyası
İşçi və massivlərini elan edək, burada
fi[i] = φ(i);
sum[i] = φ(1) + φ(2) + ... φ(i)
#define MAX 10001
long long fi[MAX], sum[MAX];FillEuler funksiyası massivini Eyler funksiyasının dəyərləri ilə doldurur:
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;qismi cəmlərini hesablayırıq. Massivin ilk elementlərini ilkinləşdiririk.
sum[0] = 0; sum[1] = 1;Sonra qalan qismi cəmləri ardıcıl olaraq hesablayırıq.
for(i = 2; i \u003c MAX; i++)
sum[i] = sum[i-1] + fi[i];
}Proqramın əsas hissəsi. və massivlərini doldururuq.
FillEuler();testini emal edirik.
scanf("%d",\u0026tests);
while(tests--)
{
scanf("%d",\u0026n);Hər giriş dəyəri üçün cavabı hesablayıb çap edirik
res = sum[n] * sum[n];
printf("%lld\n",res);
}