221692026-01-14 17:35:21PappMatyasAutókódoláscpp17Részben helyes 48/501ms508 KiB
#include <iostream>

using namespace std;

unsigned long long ULLMAX = 0xFFFFFFFFFFFFFFFF;
unsigned long long ULL_LAST_BIT = 0x8000000000000000;

static long long GetLower(long long n)
{
	unsigned long long i = 1;
	long long fzero = -1;
	long long fone = -1;
	while (i <= ULL_LAST_BIT)
	{
		unsigned long long bit = n & i;
		if (bit == 0)
		{
			fzero = i;
		}
		else
		{
			if (fzero != -1)
			{
				fone = i;
				break;
			}
		}
		if (i == ULL_LAST_BIT)
		{
			break;
		}
		i <<= 1;
	}
	if (fzero == -1 || fone == -1)
	{
		return -1;
	}
	n ^= fzero;
	n ^= fone;
	return n;
}

static long long GetHigher(long long n)
{
	unsigned long long i = 1;
	long long fzero = -1;
	long long fone = -1;
	while (i <= ULL_LAST_BIT)
	{
		unsigned long long bit = n & i;
		if (bit != 0)
		{
			fone = i;
		}
		else
		{
			if (fone != -1)
			{
				fzero = i;
				break;
			}
		}
		if (i == ULL_LAST_BIT)
		{
			break;
		}
		i <<= 1;
	}
	if (fzero == -1 || fone == -1)
	{
		return -1;
	}
	n ^= fzero;
	n ^= fone;

	unsigned long long rembits = fone - 1;
	unsigned long long rem = rembits & n;
	n &= ~rembits;
	int lim = 0;
	while ((rem & 1) == 0 && lim < 64)
	{
		rem >>= 1;
		lim++;
	}

	n |= rem;
	return n;
}

int main()
{
	unsigned long long n;
	cin >> n;
	cout << GetLower(n) << endl;
	cout << GetHigher(n) << endl;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base48/50
1Elfogadva0/01ms316 KiB
2Elfogadva0/01ms500 KiB
3Elfogadva2/21ms316 KiB
4Elfogadva2/21ms508 KiB
5Részben helyes1/21ms316 KiB
6Részben helyes1/21ms316 KiB
7Elfogadva2/21ms328 KiB
8Elfogadva4/41ms328 KiB
9Elfogadva4/41ms500 KiB
10Elfogadva4/41ms328 KiB
11Elfogadva4/41ms328 KiB
12Elfogadva4/41ms328 KiB
13Elfogadva4/41ms328 KiB
14Elfogadva4/41ms328 KiB
15Elfogadva4/41ms324 KiB
16Elfogadva4/41ms328 KiB
17Elfogadva4/41ms492 KiB