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