题意: f(n) 表示的是n的约数的个数,给你一个数n求m=∑i=1f(i) (i<=n)
思路:可以考虑每个数 i 是1-n里面多少个数的因子,显然1-n里面是i的倍数的个数是n/i ,则m=∑i=1n/i (i<=n)
可以用整除分块来写。
#include<iostream> #include<algorithm> #include<string.h> #include<string> #include<vector> #include<cstdio> #include<queue> #include<map> #include<set> #include<math.h> using namespace std; const int inf=0x3f3f3f3f; const int maxn=1e5+5; typedef long long ll; int dir[4][2]={-1,0,1,0,0,-1,0,1}; int main(){ ios::sync_with_stdio(false); ll n; while(cin>>n){ ll ans=0; for(ll x=1,y;x<=n;x=y+1){ y=n/(n/x); ans+=n/x*(y-x+1); } cout<<ans<<endl; } }