메모리: 14212 KB, 시간: 104 ms
애드 혹, 해 구성하기, 수학
2025년 2월 10일 03:36:23
자연수
, 과 자연수 수열 이 주어졌을 때, 다음 등식을 만족하는 자연수 수열 을 구하라.

첫 번째 줄에 자연수 과 이 공백으로 구분되어 주어진다. ()
두 번째 줄에 수열 을 나타내는 정수 개가 공백으로 구분되어 주어진다. ()
첫 번째 줄에 등식을 만족하는 수열 을 공백으로 구분하여 출력한다. 각 는
이상 이하여야 한다. 등식을 만족하는 수열이 여러 가지라면 그 중 아무거나 출력해도 된다. 만약 등식을 만족하는 수열이 존재하지 않는다면 첫 번째 줄에 을 출력한다.
문제 풀이


등식의 왼쪽에 있는 (2^m - 1)/n 항을 정수로 만들어야 하기 때문
N이 홀수일 때는 현재 값을 바로 계산하고 N+1을 해서 짝수로 만든 후 2로 나눔
N이 짝수일 때는 바로 2로 나눠서 더 작은 문제로 만듦
코드
/**
* Author: nowalex322, Kim HyeonJae
*/
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
static long N;
static int M, originalM;
static long[] A, B;
public static void main(String[] args) throws Exception {
new Main().solution();
}
public void solution() throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
// br = new BufferedReader(new InputStreamReader(new FileInputStream("src/main/java/BOJ_15948_간단한문제/input.txt")));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
st = new StringTokenizer(br.readLine());
N = Long.parseLong(st.nextToken());
M = Integer.parseInt(st.nextToken());
originalM = M;
A = new long[M];
B = new long[M];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
A[i] = Long.parseLong(st.nextToken());
}
// B 배열 계산
int idx = 0; // B배열의 현재 위치
while(M > 0) {
if(M == 1) {
// 마지막 원소 처리
B[idx] = N * A[idx];
break;
}
if(N % 2 == 1) { // N 홀수
B[idx] = N * A[idx];
N = (N + 1) / 2;
idx++;
} else { // N 짝수
// 마지막 원소는 따로 계산
B[idx + M - 1] = (N + (1L << M) - 2) * A[idx + M - 1];
N /= 2;
}
M--;
}
// 원래 길이(originalM)
for(int i = 0; i < originalM; i++) {
sb.append(B[i]);
if(i < originalM-1) sb.append(" ");
}
sb.append('\n');
System.out.println(sb);
bw.flush();
bw.close();
br.close();
}
}
/**
* Author: nowalex322, Kim HyeonJae
*/
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
static long N;
static int M;
static long[] A, B;
public static void main(String[] args) throws Exception {
new Main().solution();
}
public void solution() throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
// br = new BufferedReader(new InputStreamReader(new FileInputStream("src/main/java/BOJ_15948_간단한문제/input.txt")));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
st = new StringTokenizer(br.readLine());
N = Long.parseLong(st.nextToken());
M = Integer.parseInt(st.nextToken());
A = new long[M];
B = new long[M];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
A[i] = Long.parseLong(st.nextToken());
}
solve(N, M, 0);
for(int i=0; i<M; i++) {
sb.append(String.valueOf(B[i]));
if(i < M-1) sb.append(" ");
}
sb.append('\n');
System.out.println(sb);
bw.flush();
bw.close();
br.close();
}
private static void solve(long n, int m, int k){
if(m == 1){
B[k] = n * A[k];
return;
}
if(n%2 == 1){
B[k] = n * A[k];
solve((n+1)/2, m-1, k+1);
return;
}
else{
solve(n/2, m-1, k);
B[k+m-1] = (n + (1L<<m) - 2) * A[k+m-1];
}
}
}