HDOJ 4342History repeat itself(数学)
2015-09-22 16:05
239 查看
第一问:求第n大的非平方数是多少。
设第n大的非平方数是x,则x前面有sqrt(x)个平方数,于是n+(int)sqrt(x)=x
另t=sqrt(x)>0,得到方程 t^2-t-n=0
根据求根公式t=(1+sqrt(1+4×n))/2
对t向上取整再减去1,就算x前面有多少平方数了,
根据最前面的式子,x=n+t
第二问:
发现可以分为两部分,第一部分是1*3+2*5+3*7+4*9+........+t*(2t-1),
i*(2i+1),整理一下是2*i^2+i,利用平方和公式可以很容易的算出来了
第二部分是剩下的数,都是t+1,很容易计算了。
设第n大的非平方数是x,则x前面有sqrt(x)个平方数,于是n+(int)sqrt(x)=x
另t=sqrt(x)>0,得到方程 t^2-t-n=0
根据求根公式t=(1+sqrt(1+4×n))/2
对t向上取整再减去1,就算x前面有多少平方数了,
根据最前面的式子,x=n+t
第二问:
发现可以分为两部分,第一部分是1*3+2*5+3*7+4*9+........+t*(2t-1),
i*(2i+1),整理一下是2*i^2+i,利用平方和公式可以很容易的算出来了
第二部分是剩下的数,都是t+1,很容易计算了。
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; void work() { long long ans1,ans2,t,n; scanf("%I64d",&n); t=(long long)ceil(0.5*(1+sqrt(1+4*n)))-1; ans1=n+t; ans2=t*(t+1)*(2*t+1)/3-3*(t+1)*t/2+t+(t+n-t*t+1)*t; printf("%I64d %I64d\n",ans1,ans2); } int main() { int T; scanf("%d",&T); while(T--) work(); return 0; }
相关文章推荐
- JavaScript得到屏幕宽高、页面宽高
- runtime的一篇文章
- QMap的key的使用 value的使用
- 纯CSS实现的3D倒计时效果
- 1.Class.forName()报错问题
- Win7 远程 Ubuntu 桌面 mate desktop,并实现中文输入法
- onClick事件
- 泛型
- oracle视图的种类和区别
- Js获取当前日期时间及其它操作
- hdu 5433 Xiao Ming climbing(优先队列+BFS)
- opencv低级错误
- 获取下一个自增长id值的方法
- 个人项目实践
- Spring 代码知识查缺补漏
- iOS开发系列--数据存取
- Cannot change version of project facet Dynamic Web Module to 2.5
- android应用程序的组成部分
- angular 自定义指令 link
- JavaScript继承方式详解