Eyler ekstremumu#4107

Eyler ekstremumu (Həll təhlili)

Göstərilən cəmini aşağıdakı kimi yenidən yazaq:

φ(1) \cdot φ(1) + φ(1) \cdot φ(2) + ... + φ(1) \cdot φ(n) + \\ φ(2) \cdot φ(1) + φ(2) \cdot φ(2) + ... + φ(2) \cdot φ(n) + \\ . . . \\ φ(n) \cdot φ(1) + φ(n) \cdot φ(2) + ... + φ(n) \cdot φ(n)

cəmindəki hədləri ümumi vuruğa görə qruplaşdıraq:

φ(1) \cdot (φ(1) + φ(2) + … φ(n)) + \\ φ(2) \cdot (φ(1) + φ(2) + … φ(n)) + \\ . . . \\ φ(n) \cdot (φ(1) + φ(2) + … φ(n))

Bütün hədlərdə eyni vuruq iştirak edir. Onu mötərizədən kənara çıxaraq:

H = (φ(1) + φ(2) + … φ(n))^2

Ə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

sum[i] = φ(1) + φ(2) + ... + φ(i)

Bundan sonra hər giriş dəyəri üçün

sum[n] \cdot sum[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:

(φ(1) + φ(2) + … φ(10))^2 = sum[10]^2 = 32^2 = 1024

Alqoritmin realizasiyası

İşçi və massivlərini elan edək, burada

#define MAX 10001
long long fi[MAX], sum[MAX];

FillEuler funksiyası massivini Eyler funksiyasının dəyərləri ilə doldurur:

fi[i] = φ(i)~bütün~1 ≤ i \u003c MAX~üçün
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

sum[n] \cdot sum[n] = (φ(1) + φ(2) + … φ(n))^2
  res = sum[n] * sum[n];
  printf("%lld\n",res);
}