P2303 [SDOI2012] Problema de Longge (función de Euler, empujador)

P2303 [SDOI2012] Problemas con Longge

Significado: preguntarInserte la descripción de la imagen aquí

Arribista

∑ yo = 1 ngcd (i, n) ∑ re ∣ nd ∑ yo = 1 norte [mcd (i, n) = re] ∑ re ∣ nd ∑ i = 1 nd [mcd (i, nd) = 1] ∑ re ∣ nd ϕ (nd) \ sum_ {i = 1} ^ ngcd (i, n) \\ \ sum_ {d | n} d \ sum_ {i = 1} ^ n [gcd (i, n) = d] \ \ \ sum_ {d | n} d \ sum_ {i = 1} ^ {\ frac {n} {d}} [gcd (i, \ frac {n} {d}) = 1] \\ \ sum_ {d | n} d \ phi (\ frac {n} {d}) \\ i = 1ng c d ( yo ,n )d nΣrei = 1n[ g c d ( yo ,n )=d ]d nΣrei = 1ren[ g c d ( yo ,ren)=1 ]d nΣd ϕ (ren)
La primera fórmula: título.

La segunda fórmula: agregamos una enumeración, enumeramos el factor d de n (porque mcd (i, n) mcd (i, n)g c d ( yo ,n ) debe ser un factor de d) y luego contar[1, n] [1, n][ 1 ,n ] cuántosmcd (i, n) = d mcd (i, n) = dg c d ( yo ,n )=d , multiplicado por la contribución de esta d a la respuesta, cuente cada d nuevamente, es la respuesta.

La tercera fórmula: podemos entender que mcd (i, n) = d es equivalente a mcd (id, nd) = 1 mcd (i, n) = d, que es equivalente a gcd (\ frac id, \ frac nd) = 1g c d ( yo ,n )=D , y otros monovalentes a G C D (reyo,ren)=1 , es decir, podemos usar[1, n / d] [1, n / d][ 1 ,n / d ] enumeracióniii , determina cuántosmcd (i, nd) = 1 mcd (i, \ frac nd) = 1g c d ( yo ,ren)=1 es equivalente a en[1, n] [1, n][ 1 ,n ] Hojasiiyo juzgo cuántosmcd (i, n) = d mcd (i, n) = dg c d ( yo ,n )=d

La cuarta fórmula: la definición de la función de Euler.

Código

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll phi(ll x) {
    
    
	//根据欧拉函数的性质,求欧拉函数值
    ll n = x, res = x;
    if(x == 1 || x == 2) return 1;
    for(ll i=2; i*i<=x; i++) {
    
    
        if(n % i == 0) {
    
    
            res = res/i*(i-1);
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1) res -= res/n;
    return res;
}
int main() {
    
    
    ll n, ans = 0;
    cin >> n;
    for(ll i=1; i*i<=n; i++) {
    
    //枚举n的每个因子
        if(n % i == 0) {
    
    
            ans += phi(i)*(n/i);
            //如果i*i != n,i和n/i就不相等了,就可以都加起来,不然的话只能加一遍。
            if(n/i != i) ans += phi(n/i)*i;
        }
    }
    cout << ans;
    return 0;
}

Fin

Supongo que te gusta

Origin blog.csdn.net/weixin_45363113/article/details/111243026
Recomendado
Clasificación