题意:
求n*(1/1+1/2+1/3+……1/(n-2)+1/(n-1))-n
的值
由于n非常大 所以不能直接暴力。
画y=n/i 的图像 反函数
x轴为i,每个i 对应的垂直线上的整数点,即为答案,由于关于y=x对称,所以只需计算sqrt(n)即为k,结果*2
,但会增加图中红色部分,所以要减去红色部分的两倍。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <math.h>
#define LL long long
#define maxn 1005
#define INF 99999999
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==1)
{
printf("0\n");
continue;
}
LL ans=0;
int k=sqrt(n*1.0);
for(int i=1;i<=k;i++)
ans+=n/i;
ans*=2;
printf("%lld\n",ans-k*k-n);
}
return 0;
}