题目:http://acm.hdu.edu.cn/showproblem.php?pid=1215
一开始暴力。果断超时。
后发现要用筛选法或者分步计算到sqrt也行。
下面是计算到sqrt的AC代码:
#include <iostream>
#include <cmath>
using namespace std;
int set ( int num )
{
int bi = (int)sqrt( double ( num ) );
int sum = 1;
for( int i = 2; i <= bi; ++i)
{
if( num % i == 0)
{
sum += i;
int t = num / i;
if( t != i)
sum += t;
}
}
return sum;
}
int main()
{
int T;
int num;
while ( ~scanf ( "%d",&T ) )
{
while ( T-- )
{
scanf ( "%d",&num );
printf("%d\n",set(num));
}
}
return 0;
}
这是筛选的AC代码:
#include <iostream>
using namespace std;
int a[500001];
int main()
{
int m,n,i,j;
for(i=1;i<=500000;i++)/1每个人都有先加上去
a[i]=1;
for(i=2;i<=250001;i++)///只要一半就好,超过了连除2都不可能,就更别说因子了
{
for(j=i+i;j<=500000;j+=i)
{
a[j]+=i;
}
}
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}