ZJU 3175

来源:互联网 发布:育碧出的mac 编辑:程序博客网 时间:2024/05/01 23:13


题意:

求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 99999999using 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;}


0 0
原创粉丝点击