HDU4342 History repeat itself数学规律题

题目链接:

?pid=4342

题意:

就是要求第a个非平方数是什么

分析:

假设第a个非平方数是x,x前面有n个平方数,,则n*n<x<(n+1)*(n+1);

n*n前面的非平方数的个数是n*n-n;

首先先根据a求n,n是满足不等式 n*n-n<a的最大正整数。

不等式的解是:

(1+sqrt(1+4*a))/2;必需对这个数上取整,然后减一就是n了。

然后第a个非平方数就是 n*n+(a-n*n+n)=a+n

之后就是求另一个式子的值了,首先求1~n*n-1求和:

(2*n-1)*(n-1)对它从2到n求和得到:n*(n+1)*(2*n+1)/3-3*n*(n-1)/2+n;

之后加上 (n+a-n*n+1)*n;

代码如下:

#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>using namespace std;#define LL long longint t;LL n,idx,ans;int main(){scanf("%d",&t);while(t–){scanf("%lld",&n);idx=(LL)ceil((1+sqrt(1+4.0*n))/2)-1+n;LL k=idx-n;LL sum=k*idx;LL tmp=(1+k)*k*(2*k+1)/6-k;ans=sum-tmp;cout<<idx<<" "<<ans<<endl;}return 0;}



人生谁无少年时,甜苦酸辛各自知。

HDU4342 History repeat itself数学规律题

相关文章:

你感兴趣的文章:

标签云: