理论依据:
代码:
/*
显然,数据够大的时候,数组要用 __int64 */ #include<iostream>
#include<map>
#include<cstdio>
#include<cstdlib>
#include<cstring> using namespace std; bool s[];
int num[];//用来%j
int ans[];//保存和。 void make_ini() //全部扫一遍。筛选一下。
{
int i,j,k,t;
for(i=;i<=;i++)
{
num[i]=i;
ans[i]=;
}
for(i=;i<=;i++)
if(s[i]==false)//是素数
{
for(j=i;j<=;j=j+i)//枚举每个素数的倍数
{
// if(j%i==0) //这个肯定成立,不需要
{
k=;t=;
while(num[j]%i==)
{
num[j]=num[j]/i;
t=t*i;//关键部分。
k=k+t;//关键部分
}
ans[j]=ans[j]*k;
}
s[j]=true;
}
}
} int main()
{
int n;
make_ini();
while(scanf("%d",&n)>)
{
printf("%d\n",ans[n]-n);
}
return ;
}