SP5971 LCMSUM-LCM Sum (función de Euler, derivación de fórmulas)

SP5971 LCMSUM - Suma de LCM

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

Arribista

∑ i = 1 nlcm (i, n) ∑ i = 1 ningcd (i, n) n ∑ i = 1 nigcd (i, n) n ∑ re ∣ norte ∑ i = 1 nid [mcd (i, n) = d ] norte ∑ re ∣ norte ∑ yo = 1 ndi [mcd (yo, nd) = 1] norte ∑ re ∣ norte (ϕ (re) + [d = 1]) × re 2 \ sum_ {i = 1} ^ nlcm (i, n) \\ \ sum_ {i = 1} ^ n \ frac {in} {gcd (i, n)} \\ n \ sum_ {i = 1} ^ {n} \ frac {i} {gcd (i, n)} \\ n \ sum_ {d \ mid n} \ sum_ {i = 1} ^ {n} \ frac {i} {d} [gcd (i, n) = d] \\ n \ sum_ {d \ mid n} \ sum_ {i = 1} ^ {\ frac {n} {d}} i [gcd (i, \ frac {n} {d}) = 1] \\ n \ sum_ {d \ mid n} \ frac {(\ phi (d) + [d = 1]) \ times d} {2} i = 1nl c m ( yo ,n )i = 1ng c d ( yo ,n )i nnortei = 1ng c d ( yo ,n )yonorted nΣi = 1nreyo[ g c d ( yo ,n )=d ]norted nΣi = 1renyo [ g c d ( yo ,ren)=1 ]norted nΣ2( ϕ ( d )+[ d=1 ] )×d

La primera fórmula es el problema; la
segunda fórmula es poner mcm mcml c m está desensamblado; la
tercera fórmula es sacar la constante n; la
cuarta fórmula es enumerar todos los factores de n, que se pueden transformar en la cuarta fórmula; la
quinta fórmula es ad de[[gcd (i , n) = d] [[mcd (i, n) = d][ [ g c d ( i ,n )=d ] Propóngalo dentro, y luego seleccione el rango de valores, número enumeradoid \ frac idreyoTransformación iiyo[mcd (i, n) = d] [mcd (i, n) = d][ g c d ( yo ,n )=d ] se convierte en[mcd (i, nd) = 1] [mcd (i, \ frac nd) = 1][ g c d ( yo ,ren)=1 ] ; La
sexta fórmula es usar una propiedad de la función de Euler:si mcd (i, n) = 1, entonces mcd (n - i, n) = 1 (i ≠ 1) si mcd (i, n) = 1 , entonces mcd (ni, n) = 1 (i \ neq1)Como si G C D ( yo ,n )=1 , luego g c d ( n-i ,n )=1 ( yo=1 ) , y luego se puede transformar en la sexta fórmula;
final

Código de código C o d e

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
ll st[N], p[N], phi[N], sum[N], ans[N], tot;
//phi:欧拉函数,sum函数第六个公式中的欧拉函数phi*d,ans是存放答案的数组;
void init() {
    
    
    phi[1] = 1, st[1] = 1, sum[1] = 1;//sum[1]=1,把d=1的情况考虑了进去
    for(int i=2; i<N; i++) {
    
    
        if(!st[i]) p[tot++] = i, phi[i] = i-1, sum[i] = 1ll*phi[i]*i/2;
        for(int j=0; j<tot&&i*p[j]<N; j++) {
    
    
            st[i*p[j]] = 1;
            if(i % p[j] == 0) {
    
    
                phi[i*p[j]] = phi[i]*p[j];
                sum[i*p[j]] = 1ll*phi[i*p[j]]*(i*p[j])/2; 
                break;
            }
            phi[i*p[j]] = phi[i]*(p[j]-1);
            sum[i*p[j]] = 1ll*phi[i*p[j]]*(i*p[j])/2; 
        }
    }
    //类埃氏筛,把n的全部因子d加起来ans[n]+=sum[d];
    for(int i=1; i<N; i++) {
    
    
        for(int j=i; j<N; j+=i)
        ans[j] += sum[i];
    }
}
inline ll read() {
    
    //快读
    ll x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {
    
    
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
    
    
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return x * f;
}

int main() {
    
    
    init();//初始化
    ll t;
    t = read();
    while(t--) {
    
    
        int n;
        n = read();
        printf("%lld\n", ans[n]*n);
    }
    return 0;
}

Fin

Supongo que te gusta

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