一个数论定理 对于n >= 2 小于它与它互质的数的和 为 n*phi*(n)/2
然后lcm(a,b) = a * b / gcd(a, b)
时间太紧 所以打表预处理枚举每个数然后找到每个能整除它的数加上一部分欧拉函数的和
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#define maxn 1000005
#define LL long long
using namespace std;
// 欧拉函数3
LL eular[maxn];
LL prime[maxn][15],num[maxn],flag[maxn],AM = 0;
void Eorue(){
eular[1] = 1;
for(LL i = 2;i < maxn; i++){
if(eular[i] == i){
eular[i] = i - 1;
for(LL j = 2; j * i < maxn; j++){
eular[i * j] = eular[i * j] * (i - 1) / i;
}
}
//eular[i] += eular[i-1];
}
}
LL ans[maxn];
int main()
{
for(LL i = 1; i < maxn; i++) eular[i] = i;
Eorue();
for(LL i = 1; i <= 1000000; i++)
for(LL j = 1; j * i <= 1000000; j++)
{
if(j != 1)ans[j * i] += j * i * (eular[j] * j / 2ll);
else ans[j * i] += j * i;
}
int t;
scanf("%d", &t);
while(t--)
{
int n;
scanf("%d", &n);
printf("%lld\n", ans[n]);
}
return 0;
}
//277811686426000000