public class Euler220 {
    static long sx, sy, remaining;
    static int sd;

    public static void main(String[] args) {
        int order = 50;
        long steps = 1000000000000L;
        long[] F = { 1, 0, 0, 1 }, L = { 0, 0, 3, 0 }, R = { 0, 0, 1, 0 };
        long[][] a = new long[order + 1][4], b = new long[order + 1][4];
        for (int i = order - 1; i >= 0; i--) {
            a[i] = combine(combine(combine(combine(a[i + 1], R), b[i + 1]), F), R);
            b[i] = combine(combine(combine(combine(L, F), a[i + 1]), L), b[i + 1]);
        }
        sx = 0;
        sy = 0;
        sd = 3;
        remaining = steps;
        if (remaining > 0) {
            remaining--;
            apply(F);
        }
        exeA(a, b, F, L, R, 0, order);
        System.out.println(sx + "," + sy);
    }

    static void exeA(long[][] a, long[][] b, long[] F, long[] L, long[] R, int level, int order) {
        if (remaining == 0 || level >= order)
            return;
        if (remaining >= a[level][3]) {
            remaining -= a[level][3];
            apply(a[level]);
            return;
        }
        exeA(a, b, F, L, R, level + 1, order);
        if (remaining == 0)
            return;
        apply(R);
        exeB(a, b, F, L, R, level + 1, order);
        if (remaining == 0)
            return;
        remaining--;
        apply(F);
        if (remaining == 0)
            return;
        apply(R);
    }

    static void exeB(long[][] a, long[][] b, long[] F, long[] L, long[] R, int level, int order) {
        if (remaining == 0 || level >= order)
            return;
        if (remaining >= b[level][3]) {
            remaining -= b[level][3];
            apply(b[level]);
            return;
        }
        apply(L);
        if (remaining == 0)
            return;
        remaining--;
        apply(F);
        if (remaining == 0)
            return;
        exeA(a, b, F, L, R, level + 1, order);
        if (remaining == 0)
            return;
        apply(L);
        exeB(a, b, F, L, R, level + 1, order);
    }

    static void apply(long[] seg) {
        long x = seg[0], y = seg[1];
        for (int i = 0; i < sd; i++) {
            long tmp = x;
            x = y;
            y = -tmp;
        }
        sx += x;
        sy += y;
        sd = (int) ((sd + seg[2]) & 3);
    }

    static long[] combine(long[] lhs, long[] rhs) {
        long x = rhs[0], y = rhs[1];
        for (int i = 0; i < (int) lhs[2]; i++) {
            long tmp = x;
            x = y;
            y = -tmp;
        }
        return new long[] { lhs[0] + x, lhs[1] + y, (lhs[2] + rhs[2]) & 3, lhs[3] + rhs[3] };
    }
}
