这道题是真的坑人,我一拿到就想到调和级数,结果公式log(n)+r+1/(2*n)算出来的结果不对。然后我问了同学,他说找的规律,
后来我想了半天才发现有这个规律,但是在输出的时候又有误差。唉…最后还是WA了几下!
首先来看看这个规律:我开始是打的表来找规律
然后按照题的要求多带几组n值进去算出对应的H(n);
可以发现答案居然就是
然后那么问题来了,怎么找到前面的和 和 后面的和呢?
这个点 好打脑壳,居然是想根号出来(数论都这样?原谅我题写少了,,唉)
答案就是这个了 但是注意向下取整
#include<map>
#include<list>
#include<ctime>
#include<queue>
#include<deque>
#include<cmath>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define r 0.57721566490153286060651209
//ll gcd(ll a,ll b){
// return b?gcd(b,a%b):a;
//}
//ll QP(ll x,ll n,ll Mod){
// ll res=1;
// while(n){
// if(n&1){
// res=(res*x)%Mod;
// }
// x=(x*x)%Mod;
// n>>=1;
// }
// return res;
//}
ll H( ll n ) {
ll res = 0;
for(ll i = 1; i*i <= n; i++ )
{
res+=n/i;
}
return res;
}
int main()
{
ll T,n;
scanf("%lld",&T);
ll i=1;
while(T--){
scanf("%lld",&n);
ll ans1=H(n);
ll ans2=ans1*2-floor(sqrt(n))*floor(sqrt(n));
printf("Case %lld: %lld\n",i++,ans2);
}
return 0;
}