您的位置:首页 > 其它

HDU 七夕节(求一个数的因子和)

2015-08-11 09:37 253 查看
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"

人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:



数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?

[align=left]Input[/align]
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).

 
[align=left]Output[/align]
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
int f(int a){
int sum=1;
for(int i=2;i<a/2;i++){
if(a%i==0){
sum+=(a/i)+i;
}
}
return sum;

}


这是一开始的想法,超过一半之后就不可能成为因子。但是WA了,因为有成对的因子在一半以内,造成重复计算。比如20的因子:1,2,4,5,10;按照这种做法,4,5会计算两次。

int a[500000];
int f1(){
memset(a,1,sizeof(a));
for(int i=2;i<=250000;i++){
for(int j=i+i;j<=500000;j+i)
a[j]+=j;
}
return 0;
}


这是第二次尝试,答案正确,但是超时了,数组开的太大,有太多冗余计算。

int main()
{
int i,j,n,a;
while(cin>>n)
{
for(i=0;i<n;i++)
{
cin>>a;
int sum=1;
int k=int (sqrt(double (a))); //缩小了时间复杂度,
for(j=2;j<=k;j++)   //2--sqrt(a)
{
int t;
if(a%j==0)
{
sum+=j;
t=a/j;
if(t!=j)sum+=t;  //另一半不等,则相加
}
}
cout<<sum<<endl;
}
}
return 0;
}


这是参考网上博客后的答案,为什么是sqrt(n)呢?

参考地址:http://blog.sina.com.cn/s/blog_71ded6bf0100skxf.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: