问题标题: 酷町堂:5543 超时30

0
1
已解决
乔俊驰
乔俊驰
资深守护
资深守护
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int ans;
void tq(int n){
    ans=0;
    for(int i=1;i<=n;i++){
        if(n%i==0){
            ans+=i;
        }
    }
}
int main(){
    int n,m;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>m;
        tq(m);
        cout<<ans<<endl;
    }
    return 0;
}

思路:定义一个函数和ans,每次函数开始ans=0,然后提取m的因数并累加,最后循环输入输出,但奈何数据太大,超时了,有啥优化算法吗


0
已采纳
蔡乐毅
蔡乐毅
高级光能
高级光能

线筛学过吗?

用线筛把每个数的数字和全部记好

像这样:

for(int i=1;i<=5000000;i++){
		for(int j=i;j<=5000000;j+=i){
			f[j]+=i;
		}
	}

输入一个数据,输出f[n];

记得要用scanf("%.d",&n);和prinf("%.df",f[n]\n);

还有头文件!

蔡乐毅在2020-11-01 13:12:02追加了内容

蔡乐毅在2020-11-01 13:13:57追加了内容

@乔俊驰 

~望采纳~

0
蒋文瀚
蒋文瀚
新手光能
新手光能
#include<cmath>


void tq(int n){
    ans=0;
    for(int i=1;i<=sqrt(n);i++){
        if(n%i==0){
            ans+=i;
        }
    }
}

 

0
0
余彦文
余彦文
初级光能
初级光能

你可以从1到sqrt(n)开始循环,然后判断n%i是否等于零如果是,sum+=i,sum+=n/i

还有,要考虑一下i==n/i的情况

然后呢?你做了70分(滑稽)

0
赵逸凡
赵逸凡
初级启示者
初级启示者

把函数里的循环i从1到sqrt(n),然后累加的时候把i和n/i都加上,可能会提速(把循环次数改写为O(1)语句有不确定性)

建议艾筛、线筛、或者min_25筛,不过这些算法太复杂了,线筛应该能过

0
张恩泽
张恩泽
高级天翼
高级天翼

从1到sqrt (n)这样应该可以优化,记得加头文件cmath

我们老师讲这道题有点难

我要回答