#F.Suma divisible

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;
}

Supongo que te gusta

Origin blog.csdn.net/weq2011/article/details/129191087
Recomendado
Clasificación