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 C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<bits/stdc++.h> 
using namespace std;

#define PB push_back  
#define MP make_pair  
#define SZ(v) ((int)(v).size())  
#define FOR(i,a,b) for(int i=(a);i<(b);++i)  
#define REP(i,n) FOR(i,0,n)  
#define FORE(i,a,b) for(int i=(a);i<=(b);++i)  
#define REPE(i,n) FORE(i,0,n)  
#define FORSZ(i,a,v) FOR(i,a,SZ(v))  
#define REPSZ(i,v) REP(i,SZ(v))  
template<class Iter> void rprintf(const char *fmt, Iter begin, Iter end) {
    for (bool sp=0; begin!=end; ++begin) { if (sp) putchar(' '); else sp = true; printf(fmt, *begin); }
    putchar('\n');
}
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> VI;
#define db double
ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); }	
const int maxn=18;
char s[maxn];
int main()
{
	int n,m,k;
	while(scanf("%d%d%d",&n,&m,&k)==3)
	{
		if(n>m)	swap(n,m);
		bool flag=false;
		REPE(i,m){
			if(i*n==k)	flag=true;
			int sk=k-i*n;
			if(sk<0)	break;
			if(m-i*2==0)	continue;
			if(sk%(m-i*2)==0&&sk/(m-i*2)<=n&&sk/(m-i*2>0))	flag=true;
		}
		REPE(i,n){
			if(i*m==k)	flag=true;
			int sk=k-i*m;
			if(sk<0)	break;
			if(n-i*2==0)	continue;
			if(sk%(n-i*2)==0&&sk/(n-i*2)<=m&&sk/(n-i*2>0))	flag=true;
		}
		if(flag)	printf("Yes\n");
		else	printf("No\n");
	}
	return 0;
}