Problem:
Score : 200 points

Problem Statement

We have a grid with N rows and M columns of squares. Initially, all the squares are white.

There is a button attached to each row and each column.
When a button attached to a row is pressed, the colors of all the squares in that row are inverted; that is, white squares become black and vice versa.
When a button attached to a column is pressed, the colors of all the squares in that column are inverted.

Takahashi can freely press the buttons any number of times. Determine whether he can have exactly K black squares in the grid.

Constraints

1 \leq N,M \leq 1000

0 \leq K \leq NM

Input

Input is given from Standard Input in the following format:

N M K

Output

If Takahashi can have exactly K black squares in the grid, print Yes; otherwise, print No.

Sample Input 1

2 2 2

Sample Output 1

Yes

Press the buttons in the order of the first row, the first column.

Sample Input 2

2 2 1

Sample Output 2

No

Sample Input 3

3 5 8

Sample Output 3

Yes

Press the buttons in the order of the first column, third column, second row, fifth column.

Sample Input 4

7 9 20

Sample Output 4

No

Solution in Rust (1.15.1) (judge verdict: Accepted)

fn main() {
  let (n, m, k): (i32, i32, i32) = read_tuple();
  
  let mut nps: Vec<(i32, i32)> = vec![];
  for i in 0 .. n + 1 {
    nps.push((i,n-i));
  }
  
  let mut mps: Vec<(i32, i32)> = vec![];
  for i in 0 .. m + 1 {
    mps.push((i,m-i));
  }
  
  let mut vec: Vec<i32> = vec![];
  for (n1, n2) in nps {
    for (m1, m2) in mps.clone() {
      vec.push(n1*m1 + n2*m2);
    }
  }
  
  println!("{}", if vec.contains(&k) {"Yes"} else {"No"});
}

fn read_tuple<T1: std::str::FromStr, T2: std::str::FromStr, T3: std::str::FromStr>() -> (T1, T2, T3) {
  let mut buf = String::new();
  std::io::stdin().read_line(&mut buf).ok();
  let mut it = buf.trim().split_whitespace();
  let x = it.next().unwrap().parse::<T1>().ok().unwrap();
  let y = it.next().unwrap().parse::<T2>().ok().unwrap();
  let z = it.next().unwrap().parse::<T3>().ok().unwrap();
  (x, y, z)
}