【HDU

BUPT2017 wintertraining(15) #8C

题意

求第n(n<2^32)个非完全平方数m,以及(sum_{i=1}^m{lfloorsqrt i floor})

题解

设1~m中有x个完全平方数((1^2,2^2,3^2,...,x^2))。
那么有

[egin{cases} n+x=m\ x^2 < m\ (x+1)^2 ge m end{cases} ]

等价于求满足(m-sqrt m < n)的m的最大值。
于是可以二分。
预处理出(lfloorsqrt i floor)的前缀和,i出现(i*2+1)次,注意要转换为long long。

代码

#include <cstdio>
#include <cmath>
#define ll long long
int t;
const int N=1LL<<16;
ll n,x,ans,a[N];
int main(){
	for(int i=1;i<=N;i++)
		a[i]=a[i-1]+(ll)(i*2+1)*i;
	scanf("%d", &t);
	while(t--){
		scanf("%lld", &n);
		ll l=1, r=1LL<<32;
		while(l<r){
			ll m=l+r>>1;
			if(m-(ll)sqrt(m)<n)
				l=m+1;
			else
				r=m;
		}
		x=l;
		ll g=floor(sqrt(x));
		ans=a[(int)g-1]+(x-g*g+1)*g;
		printf("%lld %lld
", x, ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/flipped/p/HDU4342.html