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重叠了以交点与坐标轴围成的正方形的面积所以要减去

#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;
}
AC Code

 

posted @ 2018-08-23 15:13  子诚-  阅读(134)  评论(0编辑  收藏  举报