九度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读入输入数据。
代码:
#include <stdio.h> #include <math.h> #define N 1000 int main(void) { long long n; long long m, a, b, res; while (scanf("%lld", &n) != EOF) { m = sqrt(2*n); a = m*(m+1)/2; b = (m+1)*(m+2)/2; if (n <= a) res = m; else if (n <= b) res = m+1; else res = m+2; printf("%lld\n", res); } return 0; } /************************************************************** Problem: 1357 User: liangrx06 Language: C Result: Accepted Time:40 ms Memory:928 kb ****************************************************************/
编程算法爱好者。