tema
tren de pensamiento
Esta pregunta es un problema obvio de bloques divisibles.
El mismo valor en la tabla aparecerá continuamente y el producto del intervalo dividido por el mismo valor es un bloque entero divisible.
La naturaleza de la divisibilidad hace que la tabla de matriz de 1 a n se pueda dividir en diferentes bloques según el valor, y el número de bloques es mucho menor que n.
Usando esta propiedad, si podemos deducir dónde están los puntos finales izquierdo y derecho específicos de cada bloque, este problema se puede resolver rápidamente.
Suponiendo que conocemos el punto final izquierdo L de un determinado bloque, necesitamos resolver el punto final derecho R del bloque.
Sea el valor del bloque K, entonces k = ⌊ n/ L ⌋
Dado que cada número i en el intervalo [L, R] satisface ⌊ n/ i ⌋=k
Entonces, el límite derecho R es el i más grande que satisface la condición i*K<=N, es decir, R=⌊n/k⌋=⌊n/(⌊n/ L⌋) ⌋
el código
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,l = 1,r,k,ans;
signed main()
{
cin>>n;
while(l <= n)
{
r = n / (n / l);
k = n / l;
ans += (r - l + 1) * k;
l = r + 1;
}
cout<<ans;
return 0;
}