use std::io::{self, BufRead}; use std::str::FromStr; use std::collections::*; use std::cmp::*; struct Parser<'a> { tokens: &'a mut Iterator, } impl<'a> Parser<'a> { fn new(i: &'a mut Iterator) -> Self { Parser {tokens: i} } fn take(&mut self) -> T { match self.tokens.next().expect("empty iterator").parse() { Ok(x) => x, Err(_) => panic!() } } fn take_some(&mut self, n: usize) -> Vec { self.tokens.take(n).map(|s| match s.parse() { Ok(x) => x, Err(_) => panic!() } ).collect() } } fn get_nim(n: i64) -> Vec { let mut v = Vec::new(); let mut m = n; let mut p = 2; while m > 1 { let mut a = 0i64; while m%p != 0 { p += 1; } while m%p == 0 { a += 1; m /= p; } v.push(a); } v } fn main() { let stdin = io::stdin(); let mut tokens = stdin.lock().lines().filter_map(|x| x.ok()).flat_map(|x| x.split_whitespace().map(|s| s.to_owned()).collect::>()); let mut parser = Parser::new(&mut tokens); let n: i64 = parser.take(); let nim = get_nim(n); if nim.iter().fold(0i64, |x, y| x^y) != 0 { println!("Alice"); } else { println!("Bob"); } }