Estremo di Eulero#4107

Estremo di Eulero (Editoriale)

Riscriviamo la somma indicata nel modo seguente:

φ(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)

Raggruppiamo gli addendi nella somma per fattore comune:

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

In tutti gli addendi è presente lo stesso fattore. Mettiamolo in evidenza:

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

Implementiamo un crivello che calcoli tutti i valori della funzione di Eulero da a 10^4 e li salvi nell'array . Successivamente costruiamo l'array delle somme parziali , dove

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

Dopodiché, per ogni valore di input , stampiamo il prodotto

sum[n] \cdot sum[n]

Esempio

Consideriamo lo stato dell'array dei valori della funzione di Eulero e dell'array delle somme parziali :

Per n = 10 la risposta è pari a

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

Implementazione dell'algoritmo

Dichiariamo gli array di lavoro e , dove

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

La funzione FillEuler riempie l'array con i valori della funzione di Eulero:

fi[i] = φ(i)~per~tutti~1 ≤ i \u003c MAX
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;

Calcoliamo le somme parziali . Inizializziamo i primi elementi dell'array.

  sum[0] = 0; sum[1] = 1;

Poi calcoliamo in sequenza le rimanenti somme parziali.

  for(i = 2; i \u003c MAX; i++)
    sum[i] = sum[i-1] + fi[i];
}

Parte principale del programma. Riempiamo gli array e .

FillEuler();

Elaboriamo test.

scanf("%d",\u0026tests);
while(tests--)
{
  scanf("%d",\u0026n);

Per ogni valore di input calcoliamo e stampiamo la risposta

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