一: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; }