240
功不唐捐,玉汝于成😡。

前n项余数个数和

一:O(n)

计算贡献:前n项中,能被i(1~n)整除的数的个数为(n/i)个,,也就是 i 给前n项中(n/i)个数做了余数

#include<iostream>

using namespace std;

int main ()
{
    int n;
    cin>>n;
    long long ans=0;
    for(int i=1;i<=n;i++)
        ans+=n/i;
    cout<<ans<<endl;

    return 0;
}

将前n项加和即可

二:(倍数法)O(nlogn)

时间复杂度=O(n+n/2+n/3+……1)n个=nlogn

#include<iostream>

using namespace std;
int a[(int)1e5+5];
int main ()
{
    int n;
    cin>>n;
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j+=i)
            a[j]++;
        ans+=a[i];//当i为步长完全遍历完时,i的约数也已经遍历完了
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2019-08-05 17:46  BigXun  阅读(177)  评论(0编辑  收藏  举报