#pragma warning(disable:4996)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>

#pragma region 定義
#define i_cin(X) scanf("%d", &X)
#define i_cin2(X,Y) scanf("%d %d",&X,&Y)
#define i_cin4(X,Y,Z,W) scanf("%d %d %d %d",&X,&Y,&Z,&W)
#define i_cin3(X,Y,Z) scanf("%d %d %d",&X,&Y,&Z)
#define l_cin(X) scanf("%ld",&X)
#define f_cin(X) scanf("%f",&X)
#define l_cin2(X,Y) scanf("%ld %ld",&X,&Y)
#define s_cin(X) scanf("%s",&X)

#define  i_cout(X) printf("%d\n",X)
#define  f_cout(X) printf("%g\n",X)
#define  i_cout2(X,Y) printf("%d %d\n",X,Y)
#define  l_cout(X) printf("%ld\n",X)
#define  s_cout(X) printf("%s\n",X)
#define  ll_cout(X) printf("%lld\n",X)

typedef long long  ll;
#define rept(x, s, n) for (int x = s; x < n; x++)

#define S_RTN(S)  s_cout(S);return 0


#define _itoa(A,N) sprintf(A, "%d", N);

int i_cins(int n, int* A);
int l_cins2(int n, long* A, long* B);
int s_dsort(const void* a, const void* b);
int s_asort(const void* a, const void* b);

int  _gcd(int a, int b);
int  _swp(int* a, int* b);
int _cknum(char* a, int n);


int s_asorts(const void* a, const void* b);

//昇順
int s_asorts(const void* a, const void* b) {
	return(strcmp((char*)a, (char*)b));
}
int s_dsort(const void* a, const void* b) {
	return(*(int*)b - *(int*)a);
}
int s_asort(const void* a, const void* b) {
	return(*(int*)a - *(int*)b);
}
int l_cins2(int n, long* a, long* b) {
	int i;
	rept(i, 0, n) {
		l_cin2(*(a + i), *(b + i));
	}
	return 0;
}
int i_cins(int n, int* a) {
	int i;
	for (i = 0; i < n; i++) {
		i_cin(*(a + i));
	}

	return 0;
}
int _gcd(int a, int b) {
	int r, tmp;
	if (a < b) { tmp = a; a = b; b = tmp; }
	r = a % b;
	while (r) {
		if (!r) break;
		a = b; b = r;
		r = a % b;
	}
	return(b);
}

long _max(long a, long b) {
	return a > b ? a : b;
}
long _min(long a, long b) {
	return a < b ? a : b;
}
int _swp(int* a, int* b)
{
	int tmp;
	tmp = *b; *b = *a; *a = tmp;
	return 0;
}

int _cknum(char* a, int n) {
	int i;
	char t = '0';

	for (i = 0; i < n; i++) {
		if (a[i] < '0' || a[i]>'9') return 1;
	}
	return 0;
}

#pragma endregion
int main(void) {

	int A, B, C, X;
	int a, b, c, j = 0, i = 0,cnt, tmp;
	
	i_cin4(A, B, C, X);
	a = _min(A, X / 500);
	b = _min(B, X /100);

	cnt = 0;
	while (1) {	
		while (1) {
			//同じでなければカウントしない　続き
//			cnt += (X - 500 * i - 100 * j - 50*C <= 0) ? 1 : 0;
			tmp = X - 500 * i - 100 * j;
			if (tmp < 0) break;
			cnt+=(!tmp || (tmp / 50 <= C)) ? 1 : 0;
			if (j == b) break; 
			j++;
		}
		if (i == a) break;
		i++; 
		b = _min(B, X / 100 * i);
		j = 0;
	}
	i_cout(cnt);	
	return 0;
}



//#define  c_coin(b,c) (b >= c)?1:0;
//
//int b_coin(int a, int B,int c);
//
//int b_coin(int x, int B,int C) {
//	int j,b,tmp,cnt=0;
//
//	b = _min(x*2, B);
//	if (!b) return 1;
//
//	for (j = 0; j < b; j++) {
//		tmp = x - 2 * j;
//		if (!tmp) { cnt++; continue; }
//		cnt += (tmp <= C && C) ? 1 : 0;
//	}
//	return cnt;
//}
//
//int main(void) {
//
//	int A, B, C, X;
//	int a, i = 0, tmp, cnt = 0;
//
//	i_cin4(A, B, C, X);
//	X /= 50;
//	//a = _min(X / 500, A);
//	//if (!a) { i_cout(b_coin(a,B,C)); return 0; }
//
////	for (i = 1; i < a; i++) {
////		tmpA = X - 500 * i;
////		if (!tmpA) { cnt++; continue; }
//	tmp = X - 100 * i;
//	cnt += b_coin(tmp, B, C);
////	}
//
//	i_cout(cnt);
//	return 0;
//}
//




Measured memory_bytes: 128