【AHOI2005】约数研究

发现luogu的UI改版后AC以后不能给题目评定难度了……

P1403 [AHOI2005]约数研究

类似素数筛的一道题,不过是约数。

先顺手写了个暴力做法,TLE定了~

#include<bits/stdc++.h>
using namespace std;
long long n,sum[1000005];
int main()
{
    scanf("%d",&n);
    for(long long i=1; i<=n; i++)
    {
        for(long long j=1; j<=i; j++)
            if(i%j==0)sum[i]++;
        sum[i]+=sum[i-1];
    }
    printf("%lld",sum[n]);
    return 0;
}
暴力

O(n²),20分。

联想埃式素数筛法,我们把循环稍(da)作(liang)改动,

从1到n遍历,把每个数连同他的所有不超过n的倍数所对应的sum数组++:

#include<bits/stdc++.h>
using namespace std;
long long n,sum[1000005];
int main()
{
    scanf("%d",&n);
    for(long long i=1; i<=n; i++)
        for(long long j=i; j<=n; j=j+i)
            sum[j]++;
    for(long long i=1; i<=n; i++)
        sum[i]+=sum[i-1];
    printf("%lld ",sum[n]);
    return 0;
}
AC

我们就得到了一个O(nloglogn)近似于线性的优化算法~(这nloglogn是我胡扯的,真正的时间复杂度及其推出过程请看luogu题解)

最后数组累加。

转载于:https://www.cnblogs.com/yige2019/p/11279892.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值