九度oj 题目1357:疯狂地Jobdu序列

题目描述:

阳仔作为OJ的数据管理员,每一周的题目录入都让其很抓狂,因为题目不是他出的,他控制不了出题的速度……在等题目的时候,阳仔又不敢出去打篮球,所以只能在纸上乱涂乱写,这天,阳仔在纸上写下了这样的序列:

1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 ……

即大小为k的数字,正好会在序列中连续重复k次。写到这里,阳仔兴奋了,但是他不知道这种序列叫什么名字,那就暂时叫它jobdu疯狂序列好了。现在阳仔想让你解决一个问题是,假如给你一个整数n,你能说出这个序列中,第n个元素的大小是多少么? 记住,速度要快哦,亲~

输入:
每个测试文件包含多个测试案例,每个测试案例只有一行,即整数n,1 <= n <= 10^18,代表要查找的第n个元素。
输出:
对于每个测试案例,输出疯狂的jobdu序列中的第n个元素。
样例输入:
1
2
3
4
5
样例输出:
1
2
2
3
3
提示:

输入较大,不建议使用cin读入输入数据。

还是数学问题

代码如下

 1 #include <cstdio>
 2 #include <cmath>
 3 typedef long long ll;
 4 ll n;
 5 int main() {
 6     while(scanf("%lld",&n) != EOF) {
 7         ll ans;
 8         ans = (ll)sqrt(1 + 8 * n)- 1;
 9         ans = ans/2;
10         ll n2 = (1+ans)*ans/2;
11         while(n2 < n) {
12             ans = ans+1;
13             n2 = (1+ans)*ans/2;
14         }
15         printf("%lld\n",ans);
16     }
17     return 0;
18 }

 

posted @ 2016-08-25 12:56  Jason杰  阅读(304)  评论(0编辑  收藏  举报