※. n이 짝수일 때 항상 답이 존재한다.
(-1 1 -1 1 ...)
※. n이 5이상의 홀수일 때 항상 답이 존재한다.
두번째 조건을 만족하려면 S(i-1) + S(i) = S(i) + S(i+1)은 같아야 한다.
S1 = a, S2 = b로 가정하면 배열은 [a, b, a, b ....] 가 된다.
k가 n/2라 할 때 배열의 합은 (k+1)a + kb 이다.
(k+1)a + kb = a+b -> ka + (k-1)b = 0 -> a = k-1, b = -k ( (k(2) - k) (-k(2) + k) )
[k-1, -k, k-1, -k ....]
(k가 1일때 1*a + (1-1)b = 0 -> a= 0이 된다.)
(k가 2일떄 2*a + (2-1)b = 0 -> 2a + b = 0 -> a = 1 b = -2)
즉 k가 2이상일땐 항상 답이 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while(T --> 0) {
//StringTokenizer st = new StringTokenizer(br.readLine()," ");
int n = Integer.parseInt(br.readLine());
if(n == 2) {
sb.append("YES").append('\n');
sb.append("-1 1 ").append('\n');
}
else if(n == 3) {
sb.append("NO").append('\n');
}
else {
if(n%2 == 0) {
sb.append("YES").append('\n');
for(int i = 0; i < n/2; i++) {
sb.append("-1 1 ");
}
sb.append('\n');
}
else {
int k = n/2;
sb.append("YES").append('\n');
boolean f = false;
for(int i = 0; i < n; i++) {
if(!f) {
sb.append(k-1).append(" ");
f = true;
}
else {
sb.append(-k).append(" ");
f = false;
}
}
sb.append('\n');
}
}
}
System.out.println(sb);
}
}
'코드포스' 카테고리의 다른 글
[Codeforces Round #842 (Div. 2)] B. Quick Sort (0) | 2023.01.06 |
---|---|
[Hello 2023] C. Least Prefix Sum (0) | 2023.01.05 |
[Codeforces Round #835 (Div. 4)] F. Quests (0) | 2022.12.16 |
[Codeforces Round #834 (Div. 3)] B. Lost Permutation (0) | 2022.11.20 |
[Codeforces Round #827 (Div. 4)] F. Smaller (0) | 2022.10.14 |