
https://www.acmicpc.net/problem/13018
[ 문제 요약 ]
1부터 N까지 모든 수가 한 번씩 나오는 수열에서 gcd(i, A[i]) > 1 을 만족하는 i가 정확히 K개인 수열을 출력한다. 만약 조건을 만족하는 특이한 수열이 없다면 "Impossible" 을 출력한다.
[ 문제 풀이 ]
1. gcd(N, N) = N, gcd(N, N+1) = 1 이다.
2. 즉, 숫자를 하나씩 옆으로 밀게 되면 밀 숫자만큼 조건을 만족하는 숫자가 줄어든다.
3. gcd(N, 1) = 1 이기 때문에 K의 최대값은 N - 1 이 되기 때문에 K가 N 이상이라면 Impossible이다.
4. 조건을 만족하는 숫자가 1인 경우도 만들 수 없기 때문에 K가 1인 경우에도 Impossible이다.
[ 소스 코드 ]
#include <bits/stdc++.h>
using namespace std;
int N, K;
int arr[10101];
int main() {
cin >> N >> K;
if (K == 1 || N == K) cout << "Impossible";
else {
cout << N-K << " ";
for (int i=1; i<N-K; i++) cout << i << " ";
for (int i=N-K+1; i<=N; i++) cout << i << " ";
}
return 0;
}
[ 주의할 점 ]
gcd가 가지는 속성 중 gcd(N, N+1) = 1 을 잘 이용해서 풀면 된다.
'백준' 카테고리의 다른 글
| [ 백준 2470 ] 두 용액 (c/c++) (0) | 2024.09.26 |
|---|---|
| [ 백준 11877 ] 홍수 (c/c++) (1) | 2024.09.25 |
| [ 백준 15927 ] 회문은 회문아니야!! (c/c++) (0) | 2024.09.23 |
| [ 백준 28325 ] 호숫가의 개미굴 (0) | 2024.09.22 |
| [ 백준 28359 ] 수열의 가치 (c/c++) (0) | 2024.09.21 |