import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	}

} import java.util.Scanner; Scanner java.util public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	}

} Main public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	} main {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	} Scanner scan = new Scanner(System.in); scan new Scanner(System.in) int num_500Coin = scan.nextInt(); num_500Coin scan.nextInt() scan.nextInt scan int num_100Coin = scan.nextInt(); num_100Coin scan.nextInt() scan.nextInt scan int num_50Coin = scan.nextInt(); num_50Coin scan.nextInt() scan.nextInt scan int target_amount = scan.nextInt(); target_amount scan.nextInt() scan.nextInt scan int n_pattern=0; n_pattern 0 if(num_500Coin<0 || num_500Coin > 50) return; num_500Coin<0 || num_500Coin > 50 num_500Coin<0 num_500Coin 0 num_500Coin > 50 num_500Coin 50 return; if(num_100Coin<0 || num_100Coin > 50) return; num_100Coin<0 || num_100Coin > 50 num_100Coin<0 num_100Coin 0 num_100Coin > 50 num_100Coin 50 return; if(num_50Coin<0 || num_50Coin > 50) return; num_50Coin<0 || num_50Coin > 50 num_50Coin<0 num_50Coin 0 num_50Coin > 50 num_50Coin 50 return; if((num_500Coin + num_100Coin + num_50Coin)<1) return; (num_500Coin + num_100Coin + num_50Coin)<1 (num_500Coin + num_100Coin + num_50Coin) num_500Coin + num_100Coin + num_50Coin num_500Coin num_100Coin num_50Coin 1 return; if(target_amount<50 || target_amount>20000) return; target_amount<50 || target_amount>20000 target_amount<50 target_amount 50 target_amount>20000 target_amount 20000 return; if(target_amount%50 !=0) return; target_amount%50 !=0 target_amount%50 target_amount 50 0 return; int y; y for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		} int i = 0; int i = 0; i 0 i <= num_500Coin i num_500Coin i++ i++ i {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		} {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		} y = target_amount - 500*i y target_amount - 500*i target_amount 500*i 500 i if(y<0) continue; y<0 y 0 continue; if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			} y==0 y 0 {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			} n_pattern++ n_pattern continue; for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			} int j = 0; int j = 0; j 0 j <= num_100Coin j num_100Coin j++ j++ j {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			} {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			} int tmp1; tmp1 tmp1 = y - 100*j tmp1 y - 100*j y 100*j 100 j if(tmp1<0) continue; tmp1<0 tmp1 0 continue; if(tmp1==0) {
					n_pattern++;
					continue;
				} tmp1==0 tmp1 0 {
					n_pattern++;
					continue;
				} n_pattern++ n_pattern continue; for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				} int k = 0; int k = 0; k 0 k <= num_50Coin k num_50Coin k++ k++ k {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				} {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				} int tmp2; tmp2 tmp2 = tmp1 - 50*k tmp2 tmp1 - 50*k tmp1 50*k 50 k if(tmp2<0) continue; tmp2<0 tmp2 0 continue; if(tmp2==0) {
						n_pattern++;
						continue;
					} tmp2==0 tmp2 0 {
						n_pattern++;
						continue;
					} n_pattern++ n_pattern continue; System.out.println(n_pattern) System.out.println System.out System System.out n_pattern String[] args args public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	}

} public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	}

} Main
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//input
			// each coin num
			// amount
		// pattern num
		//logic
			//1.(総当たり式)amoutから各パターン(各coinの合計)を引いて、0になったら有効なパターンとしてカウント。
				//(各コインの枚数分試行する必要があるので、三重ループ)
				//一番値が大きいcoinから決め打ちにする
				//問題
					//三重ループだと重い
			//2.
		Scanner scan = new Scanner(System.in);
		
		int num_500Coin = scan.nextInt();
		int num_100Coin = scan.nextInt();
		int num_50Coin = scan.nextInt();
		int target_amount = scan.nextInt();
		
		int n_pattern=0;
		
		//条件check
		if(num_500Coin<0 || num_500Coin > 50) return;
		if(num_100Coin<0 || num_100Coin > 50) return;
		if(num_50Coin<0 || num_50Coin > 50) return;
		if((num_500Coin + num_100Coin + num_50Coin)<1) return;
		if(target_amount<50 || target_amount>20000) return;
		if(target_amount%50 !=0) return;
		
		//caluc
		int y;
		
		for(int i = 0;i <= num_500Coin;i++) {
			y = target_amount - 500*i;
			if(y<0) continue;
			if(y==0) {//他のコインが0枚のパターン
				n_pattern++;
				continue;
			}
			
			for(int j = 0;j <= num_100Coin;j++) {
				int tmp1;
				tmp1 = y - 100*j;
				if(tmp1<0) continue;
				if(tmp1==0) {
					n_pattern++;
					continue;
				}
				
				for(int k = 0;k <= num_50Coin;k++) {
					int tmp2;
					tmp2 = tmp1 - 50*k;
					if(tmp2<0) continue;
					if(tmp2==0) {
						n_pattern++;
						continue;
					}
					
				}
			}
		}
		
		System.out.println(n_pattern);
		
		//よりスコアが高い人のロジック
		/*
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		int x = sc.nextInt();
		int j = 0;
		for(int i = 0;i <= a;i++) { 
			for(int s = 0;s <= b;s++) { 
				for(int q = 0;q <= c;q++) { 
					if(500 * i + 100 * s + 50 * q == x) {
						j++;
					}
				}
			}
		}
		*/
	}

}
