题目大意:输入 k,使得? 1 ? 2 ? … ? n = k,其中 ? 为+ 或 -,求 n。
解题思路:找规律
n | 可能的k | n / 2 |
---|---|---|
1 | -1、1 | 0 |
2 | -3、-1、1、3 | 1 |
3 | -6、-4、-2、0、2、4、6 | 1 |
4 | -10、-8、-6、-4、-2、0、2、4、6、8、10 | 2 |
5 | -15、-13、-11、-9、-7、-5、-3、-1、1、3、5、7、9、11、13、15 | 2 |
可以发现,k 的最大值为 n(1+n)/2,当 n 和 n / 2 同时为奇数或同时为偶数时,可能的 k 为偶数;n 和 n / 2 一奇一偶,可能的 k 为奇数。
枚举 n 直到 n(1+n)/2 大于 k,判断 k、n、n/2 的性质,得到相应答案。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#include<cmath>
using namespace std;
int main() {
int T;
scanf("%d", &T);
while(T--) {
long long k;
scanf("%lld", &k);
if (k < 0) k = -k;
int i = 0, n = 0;
while(1) {
i++;
if (k <= (1 + i) * i / 2) break;
}
if (k % 2 == 0) {
if(i % 2 == 1 && (i / 2) % 2 == 1) n = i;
else if(i % 2 == 0 && (i / 2) % 2 == 0) n = i;
else if(i % 2 == 0) n = i + 1;
else n = i + 2;
}
if (k % 2 == 1) {
if(i % 2 == 1 && (i / 2) % 2 == 0) n = i;
else if(i % 2 == 0 && (i / 2) % 2 == 1) n = i;
else if(i % 2 == 0) n = i + 1;
else n = i + 2;
}
printf("%d\n",n);
if(T) printf("\n");
}
return 0;
}