/*
首先求一个最小前n项和Sn大于等于k, 如Sn == k,则n必为所求值;
否则求出差值 d = Sn - k, 因为k > S(n-1), 所以0 < d < n;
若d为偶数,只要将值 d/2 前符合设为负。
若d为奇数, 1)若n为偶数,则n+1为奇数,则前n+1项即可表示k,
2) 若n为奇数,则n+2为奇数,则前n+2项即可
*/
#include <cstdio>
#include <cmath>
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T, k;
scanf("%d", &T);
while(T--) {
scanf("%d", &k);
if(k == 0) {
printf("3\n");
if(T) printf("\n");
continue;
}
if(k < 0) k = -k;
int n = (sqrt(0.2+2*k) - 0.5) + 1;
int d = n*(n+1)/2 - k;
if(d%2) {
if(n%2) n += 2;
else ++n;
}
printf("%d\n", n);
if(T) printf("\n");
}
return 0;
}
UVa 10025 - The ? 1 ? 2 ? ... ? n = k problem
最新推荐文章于 2019-02-17 18:39:54 发布