efecto Título: acumulación de 1 a n, gcd dos números (i, j) (1 = <i <n && i <j <= n).
Solución: Supongamos que un <b, si gcd (a, b) = c . El gcd (a / c, b / c) = 1. Esto es a / ay b / c primos entre sí con el a / c, un total de primer Oula (a / c) -ésimo, es decir donde el b / c, un total de Oula (a / c) las especies Alternativamente, de la misma manera, gcd (a, b) = c, a elección tendrán, oula (b / c) las especies.
Por lo tanto, gcd (x, y) = 1, x cada enumeración, y enumeración de x en los k veces, la respuesta es ans [x * k] + = oula (x) * k. Por último, pregunte acerca de los prefijos y vaya en la línea.
código:
#include <bits / STDC ++ h.> usando espacio de nombres std; typedef largo largo ll; const ll maxN = 4000000 + 2 ; const ll N = 4000000 + 7 ; suma ll [N]; ll ans [N]; ll p [N]; void oula () { ll i, j; para (i = 1 ; i <= maxN; i ++ ) p [i] = i; para (i = 2 ; i <= maxN; i + = 2 ) p [i] / = 2 ; para (i =3 ; i <= maxN; i + = 2 ) si (p [i] == i) { para (j = i; j <= maxN; j + = i) p [j] = (p [j] / i * (i- 1 )); } } Void resolver () { para (ll x = 2 ; x <maxN; x ++ ) para (LL i = 1 ; i * x <maxN; i ++ ) ans [i * x] = ans [i * x] + p [x] * i; para (ll i = 1 ; i <maxN; i ++) ans [i] + = ans [i- 1 ]; } Int main () { oula (); ll n; resolver(); mientras que (cin >> n, n) cout << ans [n] << endl; volver 0 ; }