나만의 풀이
모든 m에대해 정확히 순서쌍이 하나가 존재한다.
m=17이면 4, 0
x<=y 이기때문에 작은수가 x고 큰수는 y.
그런데
모든수에 순서쌍이 정확히 하나존재한다면....
m이 짝수일때는 무조건 x=1,
m이 홀수일때는 무조건 x= 0 이 나오는거같은데?
예를 많이 들어보자
35면, 2^5+3이면 2^x=3 이면 x는 로그 2의 3이잖아.
그럼 무조건 x가 1,0이라는건 아니네
흠 잠시만..
m을 받았을때, x의 남은수를 xremain 이라고 하자 ( remain 이 나머지라는 뜻)
y의 승을 ycount 라고 하자.
xremain은 그럼 m-2^(ycount) = xremain 이다.
2^x = xremain이면
위 식에 x를 대입하면
m은 미리 입력받으니까 ㄱㅊ고 y는 계산해서 미리나오니까 아 이게아닌가;;
이것도 아닌거같은데
m은 사용자한테 받는 값이니까 변수가아니고
y에 대한식으로 바꿔볼까? 아니다.
m을 입력 받는다.
예를들어 10이면
흠.,..x,y가 음이아닌 정수라는데 나 지금동안 뭐했냐?
2^y는 가장 m 에 가까워지는 수를 구하고
2^x 가 나머지다. 그럼
------------------------모르겠따 하 하루 푹 김치마냥 머리에서 익히고 내일 보자-------------
한가지 방법은 로그를 사용해서 내림을 사용하는것.
또 한가지 방법은 이진법을 사용하는 것이다.
로그를 사용한다면,
log 2 를 아래 넣어주면 10일경우 3.xxx가 나오니까 내림을 할시 3이 나오며 y의 값을 찾을 수 있다.
10에서 2^3을 빼면 2^x이므로
2^x = 2 이다.
양쪽에 또 log 2 를 해주면 x = 1이나온다.
그런데 11일경우는 또 1.xxx가 나오게 되므로 여기도 내림을 해주면 1이된다.
예외가 있다.
16같은 수일때.
4 0 나오지만 다 더하면 17이 된다. 이런 예외 처리를 해줘야함
m-2^y 가 0일때?를 예외처리해줘야할거같은데?
내가 푼 코드
CHATGPT 수정코드
출력할때는 가운데 공백을 넣어주고 endl;을 무조건 넣어주네?
그런데 예외처리 할때 보니까
16이면 2^4다.
근데 4 0 이 아니라 3 3 이다.
2^3 +2^3 은 16이니까
그럼 y값에 -1 을 해주고 그 값을 x에 도 넣어주면 된다.
그런데 출력 초과가 떴다 어떡하지?
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, m;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> m;
int y = floor(log2(m)); // 3
int x = floor(log2(m - pow(2, y))); // 1
if (m - pow(2, y) == 0) {
x= x-1;
y=x;
}
cout << x << " " << y << endl;
}
return 0;
}
틀렸다.
16을 넣으니 엄청 큰수가 나오는데?
if (m - pow(2, y) == 0) {
y= y-1;
x=y;
}
x와 y가 바뀌었던거 같다...
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, m;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> m;
int y = floor(log2(m)); // 3
int x = floor(log2(m - pow(2, y))); // 1
if (m - pow(2, y) == 0) {
y= y-1;
x=y;
}
cout << x << " " << y << endl;
}
return 0;
}
아니 왜틀린거야 ㅆㅂ;;;
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long n, m;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> m;
int y = floor(log2(m)); // 3
int x = floor(log2(m - pow(2, y))); // 1
if (m - pow(2, y) == 0) {
y= y-1;
x=y;
}
cout << x << " " << y << endl;
}
return 0;
}
n,m 자료형을 long long 으로 바꿨다.
그래도 틀렸다..
근데 출력은 맞는데... 왤까? 일단 킵
이제 해석보자
'코딩' 카테고리의 다른 글
백준 9372 c++ (0) | 2023.06.30 |
---|---|
백준 28173 c++ (0) | 2023.06.22 |
백준 2745번 c++ (0) | 2023.06.20 |
백준 10810 c++ (0) | 2023.06.19 |
백준 4948 c++ (0) | 2023.06.16 |