5758 2023. 09. 17 17:30:12 kukkerman Autókódolás cpp14 Elfogadva 50/50 3ms 3980 KiB
#include <iostream>

int64_t beolvas(std::istream &in) {
    int64_t k;
    in >> k;

    return k;
}
// elozo:
//   ... | 1 | 0{n} | 1{e}  =>  ... | 0 | 1{e+1} | 0{n-1}
// 
// kovetkezo:
//   ... | 0 | 1{e} | 0{n}  =>  ... | 1 | 0{n+1} | 1{e-1}

std::pair<int64_t, int64_t> feldolgoz_ciklus_nelkul(int64_t k) {
    // elozo kod
    int64_t elozo_kod;
    auto elso_nulla_bit = ~k & (k + 1);
    if (elso_nulla_bit < k) {
        auto y = k & ~(elso_nulla_bit - 1);
        auto kov_egyes_bit = y & -y;
        auto felso_bitek = k & ~(kov_egyes_bit * 2 - 1);
        elozo_kod = felso_bitek | (elso_nulla_bit * 2 - 1) * (kov_egyes_bit / elso_nulla_bit / 2);

    } else {
        elozo_kod = -1;
    }

    // kovetkezo kod
    auto elso_egyes_bit = k & -k;
    auto y = k | (elso_egyes_bit - 1);
    auto kov_nulla_bit = ~y & (y + 1);
    auto felso_bitek = k & ~(kov_nulla_bit - 1);
    int64_t kovetkezo_kod = felso_bitek | kov_nulla_bit | (kov_nulla_bit - 1) / elso_egyes_bit / 2;

    if (kovetkezo_kod > 1000000000000LL) {
        kovetkezo_kod = -1;
    }

    return { elozo_kod, kovetkezo_kod };
}

std::pair<int64_t, int64_t> feldolgoz(int64_t k) {
    int64_t bit = 1;
    int64_t e = 0;
    while ((k & bit) != 0) {
        e++;
        bit <<= 1;
    }

    int64_t elozo_kod;
    if (bit < k) {
        int64_t n = 0;
        while ((k & bit) == 0) {
            n++;
            bit <<= 1;
        }

        int64_t also_maszk = (1LL << (n + e + 1)) - 1;
        elozo_kod = (k & ~also_maszk) | (((1LL << (e + 1)) - 1) << (n - 1));

    } else {
        elozo_kod = -1;
    }

    bit = 1;
    int64_t n = 0;
    while ((k & bit) == 0) {
        n++;
        bit <<= 1;
    }

    e = 0;
    while ((k & bit) != 0) {
        e++;
        bit <<= 1;
    }

    int64_t also_maszk = (1LL << (n + e + 1)) - 1;
    int64_t kovetkezo_kod = (k & ~also_maszk) | (1LL << (n + e)) | ((1 << (e - 1)) - 1);

    if (kovetkezo_kod > 1000000000000LL) {
        kovetkezo_kod = -1;
    }

    return { elozo_kod, kovetkezo_kod };
}

int main() {
    const auto k = beolvas(std::cin);
    const auto p = feldolgoz_ciklus_nelkul(k);

    std::cout << p.first << '\n' << p.second << std::endl;

    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1872 KiB
2 Elfogadva 0/0 3ms 2076 KiB
3 Elfogadva 2/2 3ms 2284 KiB
4 Elfogadva 2/2 3ms 2536 KiB
5 Elfogadva 2/2 3ms 2868 KiB
6 Elfogadva 2/2 3ms 3032 KiB
7 Elfogadva 2/2 2ms 3128 KiB
8 Elfogadva 4/4 3ms 3152 KiB
9 Elfogadva 4/4 2ms 3140 KiB
10 Elfogadva 4/4 2ms 3144 KiB
11 Elfogadva 4/4 3ms 3392 KiB
12 Elfogadva 4/4 3ms 3508 KiB
13 Elfogadva 4/4 3ms 3696 KiB
14 Elfogadva 4/4 3ms 3880 KiB
15 Elfogadva 4/4 2ms 3868 KiB
16 Elfogadva 4/4 2ms 3868 KiB
17 Elfogadva 4/4 2ms 3980 KiB