PS

[백준] 24500번 blobblush

Eastplanet 2022. 3. 24. 18:01

https://www.acmicpc.net/problem/24500

 

24500번: blobblush

길이 K의 수열 A가 같은 길이의 수열 B보다 사전순으로 앞선다는 것은, A의 1~(i-1)번째 원소와 B의 1~(i-1)번째 원소가 같으면서, A의 i번째 원소가 B의 i번째 원소보다 작은 i가 있다는 것이다.

www.acmicpc.net

 

배타적 논리합은 둘 중 하나의 비트만 1일 때 1이 된다.

7(0111) ⊕ 2(0010) = 5(0101)

배타적 논리합의 결과는 두 수의 최상위 비트보다 더 큰 수가 나올 수 없다.8(1000) 과 8 보다 아래의 수의 배타적 논리합의 최대값은 15(1111)가 최대임을 알 수 있다.

 

또한 1000은 그 아래에 0111이 존재하고, 1010과 같은 수도 그 아래에 0101과 같은 수가 존재하기 때문에 최상위 비트까지 1로만 구성되어 있는 수를 최대 2장으로 만들 수 있다.1000 ⊕ 0111 = 1111 , 1010 ⊕ 0101 = 1111처음 주어지는 수가 이미 7(111) 1로만 구성되어 있다면 해당 수가 최대 값임을 알 수 있고처음 주어지는 수가 1로만 구성되어 있지 않다면 그 수를 flip한 수와 배타적 논리합을 하여 최대 값을  구할 수 있다.1000 ⊕ 0111(1000의 flip) = 1111

 

 

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;

int arr[100000];
int flip[100000];
int bitSize = 0;

void tran(unsigned long long N) {
	if (N == 0) {
		arr[bitSize] = 0;
		bitSize++;
		return;
	}
	
	while (N > 0) {
		if (N % 2 == 1) {
			N = N / 2;
			arr[bitSize] = 1;
		}
		else {
			N = N / 2;
			arr[bitSize] = 0;
		}
		bitSize++;
	}

	

}

void bitflip() {
	for (int i = 0; i < bitSize; i++) {
		if (arr[i] == 0) {
			flip[i] = 1;
		}
		else {
			flip[i] = 0;
		}
	}
}

unsigned long long reTran() {
	unsigned long long sum = 0;
	unsigned long long gop = 1;

	for (int i = 0; i < bitSize; i++) {
		if (flip[i] == 1) {
			sum = sum + gop * flip[i];
			gop = gop * 2;
		}
		else {
			gop = gop * 2;
		}
	}

	return sum;
}



int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	unsigned long long N;
	cin >> N;

	tran(N);
	
	

	int flag = 1;

	for (int i = 0; i < bitSize; i++) {
		if (arr[i] == 0) {
			flag = 0;
			break;
		}
	}

	if (flag == 1) {
		cout << 1 << '\n';
		cout << N;
		return 0;
	}

	bitflip();

	unsigned long long result = reTran();


	cout << 2 << '\n';
	cout << result << " " << N;



	


	
}