use std::{collections::VecDeque, io::Stdin, str::FromStr};

struct Scanner {
    stdin: Stdin,
    buf: VecDeque<String>,
}

impl Scanner {
    fn new() -> Scanner {
        Scanner {
            stdin: std::io::stdin(),
            buf: VecDeque::new(),
        }
    }

    fn read(&mut self) -> String {
        loop {
            if let Some(x) = self.buf.pop_front() {
                break x;
            }
            let mut s = String::new();
            self.stdin.read_line(&mut s).unwrap();
            s.trim()
                .split_whitespace()
                .for_each(|x| self.buf.push_back(x.to_string()));
        }
    }

    fn string(&mut self) -> String {
        self.read()
    }

    fn parse<T: FromStr>(&mut self) -> T {
        self.read().parse().ok().unwrap()
    }

    fn u64(&mut self) -> u64 {
        self.parse()
    }

    fn i64(&mut self) -> i64 {
        self.parse()
    }

    fn chars(&mut self) -> Vec<char> {
        self.string().chars().collect()
    }
}

fn main() {
    let mut scanner = Scanner::new();
    let a = scanner.i64();
    let b = scanner.i64();

    let mut state = [0; 3];
    state[2] = a;
    for i in 0..b {
        state[0] = state[1];
        state[1] = state[2];
        state[2] = 0;
        state[2] -= state[0];
        state[1] -= state[0];
        state[0] = 0;
    }

    println!("{} {}", state[1], state[2]);
}