Riscriviamo la somma indicata nel modo seguente:
Raggruppiamo gli addendi nella somma per fattore comune:
In tutti gli addendi è presente lo stesso fattore. Mettiamolo in evidenza:
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
Dopodiché, per ogni valore di input , stampiamo il prodotto
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
Implementazione dell'algoritmo
Dichiariamo gli array di lavoro e , dove
fi[i] = φ(i);
sum[i] = φ(1) + φ(2) + ... φ(i)
#define MAX 10001
long long fi[MAX], sum[MAX];La funzione FillEuler riempie l'array con i valori della funzione di Eulero:
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
res = sum[n] * sum[n];
printf("%lld\n",res);
}