A New Function LightOJ - 1098
https://cn.vjudge.net/contest/303164#problem/E
题目大意:求1到n所有数的所有因子(不包括1和它本身)的和
//o(n)的算法,会T
//for (int i=2; i<=n; ++i)
//{
// sum+=(n/i-1)*i;
//}
#include <stdio.h>
#include <math.h>
int main()
{
long long t,cas=0;
scanf("%lld",&t);
while(t--)
{
long long ans=0;
long long n;
scanf("%lld",&n);
for(long long i=2;i<=sqrt(n);i++)
{
ans+=(n/i-1)*i;//对于1到sqrt(n)的数,进行第一种操作,直接加上这个数乘以他出现的次数,i出现的次数是(n/i)-1次(对于前n个数的所有因子来说)
if(n/i>sqrt(n))//对于在sqrt(n)+1到n/2的数,因为书太多,用第一种方法会T;可以发现,当i很大的时候,每个数作为因子出现的次数很久才会变化一次
{
long long p=sqrt(n)+1;
long long q=n/i;
ans+=(q-p+1)*(q+p)/2;//用等差数列求和的方法,计算出p到q之间的数的和,sqrt(n)+1作为因子出现了几次,这语句就执行几次
}
}
printf("Case %lld: %lld\n",++cas,ans);
}
return 0;
}