1. Enlace de título:
UVA-11426
2. La idea principal del tema:
3. Análisis:
Publicar una solución al problema de Juju, naturalmente, no es algo en lo que pueda pensar ...
Otra cosa que me ha molestado durante mucho tiempo es cómo calcular F [n] rápidamente.
Como está escrito en el blog de Juju
Ben Konjac solo pensó en el cálculo de complejidad F [], y lloraba estúpidamente solo _ (: 3 」∠) _
La solución positiva es calcular la contribución a F [] cuando mcd (x, j) = i. Es fácil obtener i | j, y la complejidad es
4. Implementación del código:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = (int)4e6;
bool is_prime[M + 5];
int cnt, prime[M + 5];
int phi[M + 5];
ll sum[M + 5];
void init()
{
cnt = 0;
memset(is_prime, 1, sizeof(is_prime));
is_prime[0] = is_prime[1] = 0;
for(int i = 2; i <= M; ++i)
{
if(is_prime[i])
{
prime[++cnt] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= cnt && i * prime[j] <= M; ++j)
{
is_prime[i * prime[j]] = 0;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
int main()
{
init();
for(int i = 1; i <= M; ++i)
{
for(int j = 2 * i; j <= M; j += i)
{
sum[j] += 1ll * i * phi[j / i];
}
}
for(int i = 1; i <= M; ++i)
sum[i] += sum[i - 1];
int n;
while(~scanf("%d", &n) && n)
{
printf("%lld\n", sum[n]);
}
return 0;
}