본문 바로가기

코드포스

[Hello 2023] B. MKnez's ConstructiveForces Task

 

 


※. 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);
	}
}