链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215
大声吼声。。真不适合做数论题。。各种超时,RE。。。
好吧,这道题的题意非常明白了,怎么做又是一回事了。
500000的上限数值肯定不能暴力了。
那么就最土的打表了。
怎么构建表格呢?
首先有一点: 一个数的倍数,则因子肯定含有这个数。
记住这个吧。。
AC代码:
#include <iostream>
using namespace std;
int a[500001];
void fun()
{
int i,j;
for(i=1;i<=500000;i++)//1每个人都有先加上去
a[i]=1;
for(i=2;i<=250001;i++)//只要一半就好,超过了无意义 {
for(j=i+i;j<=500000;j+=i)//只要是i的倍数的数肯定含有i这个因子,i自身就不加了,从i的下个开始
{
a[j]+=i;//所以加i上去
}
}
}
int main()
{
int m,n;
fun();
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}