문제
https://codeforces.com/problemset/problem/1497/C1
걸린 시간
- 실패
풀이
C++
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
#define all(c) c.begin(), c.end()
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main(){
fastio;
int tc;
cin >> tc;
while(tc--){
int n, k;
cin >> n >> k;
int d = 1;
while(n%2 == 0 && n != 4){
n /= 2;
d *= 2;
}
if(n%2 == 0) cout << d*n/2 << " " << d << " " << d << "\n";
else cout << d*(n-1)/2 << " " << d*(n-1)/2 << " " << d << "\n";
}
return 0;
}
n 값이 홀수일 땐 세 수를 (n-1)/2, (n-1)/2, 1 로 나누면 되고, 짝수일 땐 홀수가 될 때까지 계속 2로 나누어 결과값에 나눈 만큼 곱해주면 된다. 단, 값이 4아래로 내려갈 경우 3개의 수로 나눌 수 없으므로 값이 4가 된다면 n/2, 1, 1 에 나눈 만큼 곱한 후 출력한다.
LCM(a1, a2, a3) 값이 n/2 보다 작거나 같도록 하는 n의 구성을 홀수, 짝수 일 때로 나누어 찾고, 분배법칙에 의해서 n == a1 + a2 + a3 이므로 n/d == (a1 + a2 + a3)/d 는 같다는 사실을 이용해 짝수를 홀수 혹은 4로 만들어내는 아이디어를 고수들은 쉽게 찾아내는 걸 보면 정말 대단한 것 같다.
'Codeforces' 카테고리의 다른 글
Codeforces #1469A Regular Bracket Sequence (0) | 2021.04.02 |
---|---|
Codeforces #1469B Red and Blue (0) | 2021.04.02 |
Codeforces #1497B M-arrays (0) | 2021.04.01 |
Codeforces #1473C No More Inversions (0) | 2021.03.31 |
Codeforces #1475C Ball in Berland (0) | 2021.03.31 |
댓글