题意:
解法:
枚举a,那么问题变为计算b*c<=k/a的数对数量.
设f[i]为b*c=i的数量,那么f[]的前缀和就是b*c<=i的数量.
f[i]可以枚举b的因子O(sq(i))计算,预处理[1,n]的f[]复杂度为O(n*sq).
预处理完f[],并计算前缀和之后,
在[1,k]内枚举i,ans+=f[k/i]即可.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e5+5;
int f[maxm];
signed main(){
ios::sync_with_stdio(0);
int k;cin>>k;
for(int i=1;i<maxm;i++){
for(int j=1;j*j<=i;j++){
if(i%j==0){
f[i]++;
if(i/j!=j)f[i]++;
}
}
}
for(int i=1;i<maxm;i++){
f[i]+=f[i-1];
}
int ans=0;
for(int i=1;i<=k;i++){
ans+=f[k/i];
}
cout<<ans<<endl;
return 0;
}