题目链接:bzoj2226
题目大意:
多组数据。给定n,求 ∑ni=1lcm(i∗n) 。
1 <= T <= 300000,1 <= n <= 1000000
题解:
线性筛、欧拉函数
又 nd 跟 d 是一样的
所以就把式子弄成
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define N 1000100
bool ispri[N];
LL cnt,pri[N/4],phi[N],ans[N];
void Eular(LL lim)
{
cnt=0;phi[1]=1;
for (LL i=2;i<=lim;i++)
{
if (!ispri[i]) {pri[++cnt]=i;phi[i]=(i-1)*i;}
for (LL j=1;j<=cnt && pri[j]*i<=lim;j++)
{
LL k=i*pri[j];
ispri[k]=true;
if (i%pri[j]==0)
{
phi[k]=pri[j]*phi[i]/i*k;
break;
}
phi[k]=(pri[j]-1)*phi[i]/i*k;
}
}
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
LL T,lim,i,j,n;
scanf("%lld",&T);
lim=1000000;Eular(lim);
for (i=1;i<=lim;i++) ans[i]=0;
for (i=1;i<=lim;i++)
{
LL sm=(phi[i]+1)/2;
for (j=i;j<=lim;j+=i) ans[j]+=sm;
}
while (T--)
{
scanf("%lld",&n);
printf("%lld\n",n*ans[n]);
}
return 0;
}