【HDU - 4342】History repeat itself(数学)
BUPT2017 wintertraining(15) #8C
题意
求第n(n<2^32)个非完全平方数m,以及\(\sum_{i=1}^m{\lfloor\sqrt i\rfloor}\)
题解
设1~m中有x个完全平方数(\(1^2,2^2,3^2,...,x^2\))。
那么有
\[\begin{cases}
n+x=m\\
x^2 < m\\
(x+1)^2 \ge m
\end{cases}
\]
等价于求满足\(m-\sqrt m < n\)的m的最大值。
于是可以二分。
预处理出\(\lfloor\sqrt i\rfloor\)的前缀和,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\n", x, ans);
}
return 0;
}
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆