Problem Description
将所有的正整数从小到大列出,然后把其中的完全平方数都去掉,就得到了著名的Yellowstar数列。它的前几项如下:
2,3,5,6,7,8,10……
给出正整数n,请你输出Yellowstar数列的第n项(2算是第1项).
Input
第一行一个正整数T,表示有T组测试数据。
接下来T行每行为一组数据。每行一个正整数n,含义如上。
n<=10^12,T<=10^5。
Output
每组数据一行,输出Yellowstar数列的第n项。
Sample Input
2
10
1048576
Sample Output
13
1049600
解题思路
第 i 和 第 i+1个完全平方数之间,间隔 2i 个数;
Y序列中 第n项前 原本应有 x 个完全平方数: 且满足 x(x+1) = n;
求根公式得 x = -1+sqrt(1+4*n)/2.0;
x 应 向上取整.
最后 ans = n+x;
参考代码
#include <stdio.h>
#include <math.h>
int main()
{
int T;
scanf("%d",&T);
while (T--){
__int64 n,ans;
scanf("%I64d",&n);
int t = ceil((-1+sqrt(1+4*n))/2.0);
ans = n+t;
printf("%I64d\n",ans);
}
return 0;
}