Fissiamo (per esempio j = 12) e troviamo il numero di tali per cui i = MCD(i, 12). Troviamo i valori di che soddisfano questa uguaglianza. Questi saranno i = 1, 2, 3, 4, 6, 12. Cioè, qualsiasi che sia un divisore di soddisfa l'uguaglianza i = MCD(i, 12).
Il numero di tali per cui i = MCD(i, j) è uguale al numero di divisori del numero . Poiché 1 \le j \le n, resta da trovare il numero totale di divisori dei numeri da a . Cioè occorre trovare la somma
Poiché il calcolo di richiede la fattorizzazione del numero , il calcolo diretto della somma indicata richiederebbe un tempo .
Guardiamo alla somma dei divisori in un altro modo. Tra i divisori dei numeri da a , l'uno comparirà \lfloor{n \over 1}\rfloor volte, il due comparirà \lfloor{n \over 2}\rfloor volte e così via (il divisore comparirà \lfloor{n \over i}\rfloor volte). Il numero delle coppie di numeri interi cercate è uguale a
Questa somma può essere calcolata in un tempo .
Esempio
Per n = 6 abbiamo le seguenti coppie:
Il numero di coppie è uguale a
Implementazione dell'algoritmo
Leggiamo il valore di .
scanf("%d",&n);Calcoliamo la risposta secondo la formula e la stampiamo.
s = 0;
for (i = 1; i <= n; i++)
s += n / i;
printf("%d\n",s);Implementazione in Java
import java.util.*;
class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
int s = 0;
for(int i = 1; i <= n; i++)
s += n / i;
System.out.println(s);
con.close();
}
}Implementazione in Python
Leggiamo il valore di .
n = int(input())Calcoliamo la risposta secondo la formula e la stampiamo.
s = 0
for i in range(1,n+1):
s += n // i
print(s)