SP5971 LCMSUM - Soma LCM
Quer dizer: pergunte
Empurrador
∑ i = 1 nlcm (i, n) ∑ i = 1 ningcd (i, n) n ∑ i = 1 nigcd (i, n) n ∑ d ∣ n ∑ i = 1 nid [mdc (i, n) = d ] n ∑ d ∣ n ∑ i = 1 ndi [mdc (i, nd) = 1] n ∑ d ∣ n (ϕ (d) + [d = 1]) × d 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]) \ vezes d} {2} i = 1∑nl c m ( i ,n )i = 1∑ng c d ( i ,n )i nni = 1∑ng c d ( i ,n )Eund ∣ nΣi = 1∑ndEu[ g c d ( i ,n )=d ]nd ∣ nΣi = 1∑dni [ g c d ( i ,dn)=1 ]nd ∣ nΣ2( ϕ ( d )+[ d=1 ] )×d
A primeira fórmula é o problema; a
segunda fórmula é colocar lcm lcml c m é desmontado; a
terceira fórmula é eliminar a constante n; a
quarta fórmula é enumerar todos os fatores de n, que podem ser transformados na quarta fórmula; a
quinta fórmula é ad de[[mdc (i , n) = d] [[mdc (i, n) = d][ [ g c d ( i ,n )=d ] Proponha dentro e selecione a faixa de valores, número enumeradoid \ frac iddEuTransformação iii和[mdc (i, n) = d] [mdc (i, n) = d][ g c d ( i ,n )=d ] torna-se[mdc (i, nd) = 1] [mdc (i, \ frac nd) = 1][ g c d ( i ,dn)=1 ] ; A
sexta fórmula é usar uma propriedade da função de Euler:se mdc (i, n) = 1, então mdc (n - i, n) = 1 (i ≠ 1) se mdc (i, n) = 1 , então mdc (ni, n) = 1 (i \ neq1)Como se G C D ( I ,n )=1 , então g c d ( n-eu ,n )=1 ( i=1 ) , e então pode ser transformado na sexta fórmula;
fim
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;
}