GCD - Extreme (II) UVA - 11426 función de Euler y mcd

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

 

Supongo que te gusta

Origin www.cnblogs.com/Accepting/p/12536654.html
Recomendado
Clasificación