Cod sursa(job #2036985)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 11 octombrie 2017 15:48:20
Problema Fractal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>

long long n, x, y;

void citire(){
    scanf("%lld %lld %lld", &n, &y, &x);
}

bool maiMic(long long x, long long k){
    if(x <= (1 << (k - 1))){
        return true;
    }
    return false;
}

void solve(){
    long long k = n;
    long long sol = 0;

    while(k > 0){
//        I
        if(maiMic(x, k) == true && maiMic(y, k) == true){
            long long tmp = x;
            x = y;
            y = tmp;
        }
//        II
        else if(maiMic(x, k) == false && maiMic(y, k) == true){
            sol += (1 << (2 * k - 2));
            x = (1 << (k - 1)) + 1 - x;
            y = (1 << (k - 1)) + 1 - y;

            long long tmp = x;
            x = y;
            y = tmp;
//            x = (1 << (k - 1)) + 1 - x;
            
            x -= (1 << (k - 1));

        }
//        III
        else if(maiMic(x, k) == false && maiMic(y, k) == false) {
            sol += 2 * (1 << (2 * k - 2));
            x -= (1 << (k - 1));
            y -= (1 << (k - 1));
        }
//        IV
        else if(maiMic(x, k) == true && maiMic(y, k) == false){
            sol += 3 * (1 << (2 * k - 2));
            y -= (1 << (k - 1));
        }
        k--;
    }

    printf("%lld", sol);
}

int main() {
    freopen("fractal.in", "r", stdin);
    freopen("fractal.out", "w", stdout);

    citire();
    solve();

    return 0;
}