hdu 4342 History repeat itself(数学题)

题目链接:hdu 4342 History repeat itself

题意:

让你找第a个非完全平方数m,并且求前m个数的开方向下取整的和。

题解:

第一个问题:

假设第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。
第二个问题:
我们观察可以发现,第二个问题是有规律的,因为是开方向下取整,所以在两个完全平方数之前这段区间的值都是一样的,所以有公式
(2*i-1)*(i-1),然后暴力加一下就行了,然后这只是前面n*n-1的,对于n*n到a+n的单独算一下就行,当然你也可以向kuangbin那样直接推公式。
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int t;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         long long a,ans1,ans2,n;
12         scanf("%lld",&a);
13         n=ceil((1+sqrt(1+4*a))/2)-1;
14         ans1=n+a;
15         ans2=0;
16         F(i,2,n)ans2+=(long long)(2*i-1)*(i-1);
17         printf("%lld %lld
",ans1,ans2+(a+n-n*n+1)*n);
18     }
19     return 0;
20 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/6204205.html