ZOJ3175 Number of Containers
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3216
f(n,m)的意思是求(m,n]的是m的倍数的数,即为(n-m)/m
F(n)=f(n,1)+f(n,2)+...+f(n,n)=(n-1)/1+(n-2)/2+...+(n-n)/n=n/1+n/2+...+n/n-n=n/x-n (x∈(1,n))
y=n/x关于y=x对称,所以两条线的交点坐标为(sqrt(n),sqrt(n))
n/x的大小其实也就是这条线与x轴和y轴围成的面积,又n的值太大,所以求到sqrt(n)处
即:ans=n/1+n/2+...+n/sqrt(n)
再ans*2-sqrt(n)*sqrt(n)就求出了n/x的值再减去n就可以了
ans*2重叠了以交点与坐标轴围成的正方形的面积所以要减去
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cmath> using namespace std; int main() { long long t,n,ans; scanf("%d",&t); while(t--) { ans=0; scanf("%lld",&n); int k=sqrt(n); for(int i=1;i<=k;i++) ans+=n/i; ans=ans*2-n; ans-=k*k; printf("%lld\n",ans); } return 0; }