Cod sursa(job #2210225)

Utilizator giotoPopescu Ioan gioto Data 5 iunie 2018 21:54:39
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;

int k, x, y;
long long sol;
inline void divide(int k, int x, int y){
    if(k == 1) {
        if(x == 1 && y == 2) sol += 3;
        if(x == 2 && y == 2) sol += 2;
        if(x == 2 && y == 1) sol += 1;
        printf("%lld", sol);
        return ;
    }

    if(x <= (1 << (k - 1)) && y <= (1 << (k - 1))){
    ///zona 1
    int aux = y;
    y = (1 << (k - 1)) - x + 1;
    x = aux;
    y = (1 << (k - 1)) - y + 1;
    divide(k - 1, x, y);
    }

    if(x > (1 << (k - 1)) && y <= (1 << (k - 1))){
    ///zona 2
    sol += (1LL * (1 << (k - 1)) * (1 << (k - 1)));
    divide(k - 1, x - (1 << (k - 1)), y);
    }

    if(x > (1 << (k - 1)) && y > (1 << (k - 1))){
    ///zona 3
    sol += (1LL * 2 * (1 << (k - 1)) * (1 << (k - 1)));
    divide(k - 1, x - (1 << (k - 1)), y - (1 << (k - 1)));
    }

    if(x <= (1 << (k - 1)) && y > (1 << (k - 1))){
    ///zona 4
    sol += (1LL * 3 * (1 << (k - 1)) * (1 << (k - 1)));
    y -= (1 << (k - 1));
    y = (1 << (k - 1)) - y + 1;
    int aux = y;
    y = (1 << (k - 1)) - x + 1;
    x = aux;
    divide(k - 1, x, y);
    }
}
int main()
{
    freopen("fractal.in", "r", stdin);
    freopen("fractal.out", "w", stdout);
    scanf("%d%d%d", &k, &x, &y);
    swap(x, y);
    divide(k, x, y);
    return 0;
}