Problem: Mishka is decorating the Christmas tree. He has got three garlands, and all of them will be put on the tree. After that Mishka will switch these garlands on.

When a garland is switched on, it periodically changes its state — sometimes it is lit, sometimes not. Formally, if i-th garland is switched on during x-th second, then it is lit only during seconds x, x + ki, x + 2ki, x + 3ki and so on.

Mishka wants to switch on the garlands in such a way that during each second after switching the garlands on there would be at least one lit garland. Formally, Mishka wants to choose three integers x1, x2 and x3 (not necessarily distinct) so that he will switch on the first garland during x1-th second, the second one — during x2-th second, and the third one — during x3-th second, respectively, and during each second starting from max(x1, x2, x3) at least one garland will be lit.

Help Mishka by telling him if it is possible to do this!

Input

The first line contains three integers k1, k2 and k3 (1 ≤ ki ≤ 1500) — time intervals of the garlands.

Output

If Mishka can choose moments of time to switch on the garlands in such a way that each second after switching the garlands on at least one garland will be lit, print YES.

Otherwise, print NO.

Examples

Input

2 2 3


Output

YES


Input

4 2 3


Output

NO

Note

In the first example Mishka can choose x1 = 1, x2 = 2, x3 = 1. The first garland will be lit during seconds 1, 3, 5, 7, ..., the second — 2, 4, 6, 8, ..., which already cover all the seconds after the 2-nd one. It doesn't even matter what x3 is chosen. Our choice will lead third to be lit during seconds 1, 4, 7, 10, ..., though.

In the second example there is no way to choose such moments of time, there always be some seconds when no garland is lit.

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;
import java.lang.Math.*;

public class MainA
{

	static int mod = (int) 1e9 + 7;
	static int prime[]=new int[100000+1];
	static int count=0,n,m;
	static int flag=0;
	static boolean cycle;
	static int h[];
	
	static void BFS(int s,boolean visited[],ArrayList adj[])
    {
       
		h[s]=1;
        // Create a queue for BFS
        LinkedList<Integer> queue = new LinkedList<Integer>();
 
        // Mark the current node as visited and enqueue it
        visited[s]=true;
        queue.add(s);
 
        while (queue.size() != 0)
        {
            // Dequeue a vertex from queue and print it
            s = queue.poll();
            
            Iterator<Integer> i = adj[s].listIterator();
            while (i.hasNext())
            {
                int n = i.next();
                if (!visited[n])
                {
                    visited[n] = true;
                    h[n]=h[s]+1;
                    queue.add(n);
                }
            }
        }
    }
	static int dfs(int v, boolean visited[], boolean recStack[],ArrayList<Integer> adj[],int min)
	{
		int lowest=-1;
	    if(visited[v] == false)
	    {
	        // Mark the current node as visited and part of recursion stack
	        visited[v] = true;
	        recStack[v] = true;
	 
	        // Recur for all the vertices adjacent to this vertex
	        
	        for(int i =0; i < adj[v].size(); ++i)
	        {
	        	//System.out.println(v+" "+i);
	            if (!visited[adj[v].get(i)])
	            {
	            	int r=dfs(adj[v].get(i),visited,recStack,adj,min);
	            	System.out.println(v+" "+adj[v].get(i)+" "+r+" min="+min+" i="+i);
	            	lowest=Math.max(lowest,r);
	            	if(r!=-1)
	            	{
	            		if(r>=h[v])
	            		{
	            			min=-1;
	            		}
	            		else
	            		{
	            			if(min!=-1)min=h[v]-1;
	            		}	            		
	            	}
	            	//return true;
	            }
	            else if (recStack[adj[v].get(i)])
	            {
	            	cycle=true;
	            	int height=h[adj[v].get(i)];
	            	System.out.println(v+" "+adj[v].get(i)+" hei="+height+" "+i+" min="+min);
	            	if(height>min)
	            	{
	            		flag=1;
	            		return Integer.MAX_VALUE;
	            	}
	            	lowest=Math.max(lowest,height);
	            	
	            }
	        }
	 
	    }
	    recStack[v] = false;  // remove the vertex from recursion stack
	    return lowest;
	}
	 
	
	public static void main(String[] args) throws java.lang.Exception
	{
		InputReader in = new InputReader(System.in);
		PrintWriter out=new PrintWriter(System.out);

		int a[]=new int[3];
		for(int i=0;i<3;i++)a[i]=in.nextInt();
		Arrays.sort(a);
		if(a[0]==1 || (a[0]==2 && a[1]==2) || (a[0]==2 && a[1]==4 && a[2]==4) || (a[0]==3 && a[1]==3 && a[2]==3))
		{
			out.println("YES");
		}
		else out.println("NO");
		out.close();
	}
	
	public static void lcs(String X, String Y, int m, int n)
    {
        int[][] L = new int[m+1][n+1];
  
        // Following steps build L[m+1][n+1] in bottom up fashion. Note
        // that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] 
        for (int i=0; i<=m; i++)
        {
            for (int j=0; j<=n; j++)
            {
                if (i == 0 || j == 0)
                    L[i][j] = 0;
                else if (X.charAt(i-1) == Y.charAt(j-1))
                    L[i][j] = L[i-1][j-1] + 1;
                else
                    L[i][j] = Math.max(L[i-1][j], L[i][j-1]);
            }
        }
  
        // Following code is used to print LCS
        int index = L[m][n];
        int temp = index;
        int ax[]=new int[m];
        ax[0]=1;
        for(int i=1;i<m;i++)
        {
        	if(X.charAt(i)==X.charAt(i-1))ax[i]=ax[i-1]+1;
        	else ax[i]=1;
        	//System.out.print(ax[i]+" ");
        }
        //System.out.println();
        int bx[]=new int[n];
        bx[0]=1;
        for(int i=1;i<n;i++)
        {
        	if(Y.charAt(i)==Y.charAt(i-1))bx[i]=bx[i-1]+1;
        	else bx[i]=1;
        	//System.out.print(bx[i]+" ");
        }
        //System.out.println();
        // Create a character array to store the lcs string
        int a[]=new int[index];
        int b[]=new int[index];
        char[] lcs = new char[index+1];
        lcs[index] = '\0'; // Set the terminating character
  
        // Start from the right-most-bottom-most corner and
        // one by one store characters in lcs[]
        int i = m, j = n;
        while (i > 0 && j > 0)
        {
            // If current character in X[] and Y are same, then
            // current character is part of LCS
            if (X.charAt(i-1) == Y.charAt(j-1))
            {
                // Put current character in result
                lcs[index-1] = X.charAt(i-1); 
                a[index-1] =i-1;
                b[index-1]=j-1;
                // reduce values of i, j and index
                i--; 
                j--; 
                index--;     
            }
  
            // If not same, then find the larger of two and
            // go in the direction of larger value
            else if (L[i-1][j] > L[i][j-1])
                i--;
            else
                j--;
        }
  
        // Print the lcs
        //System.out.print("LCS of "+X+" and "+Y+" is ");
        //for(int u=0;u<temp;u++)
        //System.out.println(a[u]+" "+b[u]);
       
        int sum=0;
        for(int k=0;k<temp;k++)
        {
        	if(k==0)
        	{
        		sum+=(a[k]-(ax[a[k]]-1)+b[k]-(bx[b[k]]-1));
        		//System.out.println(sum+" start");
        	}
        	else
        	{
        		
        		int temp1=a[k]+b[k]-a[k-1]-b[k-1];
        		//System.out.println(k+" "+temp1+" "+(a[k]-a[k-1])+" "+ ax[a[k]]);
        		if(temp1==2)
        		{
        			if(X.charAt(a[k])!=X.charAt(a[k-1]))sum++;
        			//System.out.println(sum+" s0 ");
        		}
        		else
        		{
        			if(a[k]-a[k-1]<ax[a[k]])
        			{
        				if(b[k]-b[k-1]>bx[b[k]])
        				{
        					sum+=(b[k]-(bx[b[k]]-1)-b[k-1]);
        				}
        				else if(b[k]-b[k-1]==bx[b[k]])sum++;
        				//System.out.println(sum+" s1 ");
        			}
        			else if(a[k]-a[k-1]==ax[a[k]])
        			{
        				//System.out.println((b[k]-b[k-1])+" hare "+ bx[b[k]]);
        				if(b[k]-b[k-1]>bx[b[k]])
        				{
        					sum+=(b[k]-(bx[b[k]]-1)-b[k-1]);
        				}
        				else if(b[k]-b[k-1]==bx[b[k]])sum++;
        				//System.out.println(sum+" s2 ");
        			}
        			else
        			{
        				if(b[k]-b[k-1]>bx[b[k]])
        				{
        					sum=sum+(b[k]-(bx[b[k]]-1)-b[k-1])+(a[k]-(ax[a[k]]-1)-a[k-1])-1;
        				}
        				else if(b[k]-b[k-1]<=bx[b[k]])sum=sum+(a[k]-(ax[a[k]]-1)-a[k-1]);
        				//System.out.println(sum+" s3 ");
        			}
        		}
        	}
        	
        	if(k==temp-1){
        		sum+=(n+m-2-a[k]-b[k]);
        	}
        }
        if(sum==0)sum=n+m;
        System.out.println(sum+1);
        
    }
	public static long maxSubArraySum(int a[])
    {
        int size = a.length;
        long max_so_far = Long.MIN_VALUE, max_ending_here = 0;
 
        for (int i = 0; i < size; i++)
        {
            max_ending_here = max_ending_here + a[i];
            if (max_so_far < max_ending_here)
                max_so_far = max_ending_here;
            if (max_ending_here < 0)
                max_ending_here = 0;
        }
        return max_so_far;
    }
	public static int binarySearch(int a[],int x)
	{
		int l=0,r=a.length-1,result=-1;
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(a[mid]<x)
			{
				result=mid;
				l=mid+1;
			}
			else
			{
				r=mid-1;
			}
		}
		return result;
	}
	public static void permute(String str, int l, int r,String s[],int startx,int starty,String dir)
    {
        if (l == r)
            count+=poss(str,s,startx,starty,dir);
        else
        {
            for (int i = l; i <= r; i++)
            {
                str = swap(str,l,i);
                permute(str, l+1, r,s,startx,starty,dir);
                str = swap(str,l,i);
            }
        }
    }
 
    public static String swap(String a, int i, int j)
    {
        char temp;
        char[] charArray = a.toCharArray();
        temp = charArray[i] ;
        charArray[i] = charArray[j];
        charArray[j] = temp;
        return String.valueOf(charArray);
    }
    
    public static int poss(String str,String s[],int startx,int starty,String dir)
    {
    	if(fun(str,s,startx,starty,dir))
    	{
    		return 1;
    	}
    	else return 0;
    }
    
    public static boolean fun(String str, String s[],int startx, int starty,String dir)
    {
    	int newposx=startx,newposy=starty;
    	//System.out.println(dir);
    	for(int i=0;i<dir.length();i++)
    	{
    		int c=dir.charAt(i)-'0';
    		
    		if(str.charAt(c)=='U'){newposx--;}
    		else if(str.charAt(c)=='D'){newposx++;}
    		else if(str.charAt(c)=='L'){newposy--;}
    		else if(str.charAt(c)=='R'){newposy++;}
    		if(newposx<0||newposx>=n||newposy<0||newposy>=m)return false;
    		else if(s[newposx].charAt(newposy)=='E')return true;
    		else if(s[newposx].charAt(newposy)=='#')return false;
    	}
    	return false;
    }
    
	static class Pairs implements Comparable<Pairs>
	{
		int x;
		int y;
		int z;
		
		Pairs(int a, int b, int c)
		{
			x = a;
			y = b;
			z=c;
		}

		@Override
		public boolean equals(Object o)
		{
			Pairs other=(Pairs)o;
			return x==other.x && y==other.y;
		}
		@Override
		public int compareTo(Pairs o)
		{
			// TODO Auto-generated method stub
			if(x==o.x)
			return Integer.compare(y,o.y);
			else return Integer.compare(x,o.x);
		}
		@Override
		public int hashCode()
		{
			return  Objects.hash(x,y);
		}

	}

	public static void debug(Object... o) 
	{
		System.out.println(Arrays.deepToString(o));
	}

	public static boolean isPal(String s) 
	{
		for (int i = 0, j = s.length() - 1; i <= j; i++, j--)
		{
			if (s.charAt(i) != s.charAt(j))
				return false;
		}
		return true;
	}

	public static String rev(String s)
	{
		StringBuilder sb = new StringBuilder(s);
		sb.reverse();
		return sb.toString();
	}

	public static long gcd(long x, long y)
	{
		if (y == 0)
			return x;
		if (x % y == 0)
			return y;
		else
			return gcd(y, x % y);
	}

	public static int gcd(int x, int y)
	{
		if(y==0)
			return x;
		if (x % y == 0)
			return y;
		else
			return gcd(y, x % y);
	}

	public static long gcdExtended(long a, long b, long[] x) 
	{

		if (a == 0) 
		{
			x[0] = 0;
			x[1] = 1;
			return b;
		}
		long[] y = new long[2];
		long gcd = gcdExtended(b % a, a, y);

		x[0] = y[1] - (b / a) * y[0];
		x[1] = y[0];

		return gcd;
	}

	
	

	public static long max(long a, long b) 
	{
		if (a > b)
			return a;
		else
			return b;
	}

	public static long min(long a, long b)
	{
		if (a > b)
			return b;
		else
			return a;
	}

	public static long[][] mul(long a[][], long b[][])
	{
		long c[][] = new long[2][2];
		c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
		c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1];
		c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0];
		c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1];

		return c;
	}

	public static long[][] pow(long n[][], long p, long m)
	{
		long result[][] = new long[2][2];
		result[0][0] = 1;
		result[0][1] = 0;
		result[1][0] = 0;
		result[1][1] = 1;

		if (p == 0)
			return result;
		if (p == 1)
			return n;
		while (p != 0)
		{
			if (p % 2 == 1)
				result = mul(result, n);
			//System.out.println(result[0][0]);
			for (int i = 0; i < 2; i++)
			{
				for (int j = 0; j < 2; j++)
				{
					if (result[i][j] >= m)
						result[i][j] %= m;
				}
			}

			p >>= 1;
			n = mul(n, n);
			// System.out.println(1+" "+n[0][0]+" "+n[0][1]+" "+n[1][0]+" "+n[1][1]);
			for (int i = 0; i < 2; i++) 
			{
				for (int j = 0; j < 2; j++)
				{
					if (n[i][j] >= m)
						n[i][j] %= m;
				}
			}
		}
		return result;
	}
	public static long pow(long n,long p, long m)
	{
		long result=1;
		if(p==0)return 1;
		if(p==1)return n%m;
		while(p!=0)
		{
			if(p%2==1)result=(result*n)%m;
			p >>=1;
			n=(n*n)%m;
		}
		return result;
	}
	public static int pow(int n, int p) 
	{
		int result = 1;
		if (p == 0)
			return 1;
		if (p == 1)
			return n;
		while (p != 0)
		{
			if (p % 2 == 1)
				result *= n;
			p >>= 1;
			n *= n;
		}
		return result;
	}

	static class InputReader {

		private final InputStream stream;
		private final byte[] buf = new byte[8192];
		private int curChar, snumChars;
		private SpaceCharFilter filter;

		public InputReader(InputStream stream)
		{
			this.stream = stream;
		}

		public int snext()
		{
			if (snumChars == -1)
				throw new InputMismatchException();
			if (curChar >= snumChars)
			{
				curChar = 0;
				try 
				{
					snumChars = stream.read(buf);
				}
				catch (IOException e)
				{
					throw new InputMismatchException();
				}
				if (snumChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}

		public int nextInt()
		{
			int c = snext();
			while (isSpaceChar(c))
			{
				c = snext();
			}
			int sgn = 1;
			if (c == '-')
			{
				sgn = -1;
				c = snext();
			}
			int res = 0;
			do
			{
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			}
			while (!isSpaceChar(c));
			return res * sgn;
		}

		public long nextLong()
		{
			int c = snext();
			while (isSpaceChar(c))
			{
				c = snext();
			}
			int sgn = 1;
			if (c == '-') 
			{
				sgn = -1;
				c = snext();
			}
			long res = 0;
			do 
			{
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			}
			while (!isSpaceChar(c));
			return res * sgn;
		}

		public int[] nextIntArray(int n)
		{
			int a[] = new int[n];
			for (int i = 0; i < n; i++)
			{
				a[i] = nextInt();
			}
			return a;
		}

		public long[] nextLongArray(int n)
		{
			long a[] = new long[n];
			for (int i = 0; i < n; i++) 
			{
				a[i] = nextInt();
			}
			return a;
		}

		public String readString()
		{
			int c = snext();
			while (isSpaceChar(c))
			{
				c = snext();
			}
			StringBuilder res = new StringBuilder();
			do 
			{
				res.appendCodePoint(c);
				c = snext();
			} 
			while (!isSpaceChar(c));
			return res.toString();
		}

		public String nextLine()
		{
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			StringBuilder res = new StringBuilder();
			do
			{
				res.appendCodePoint(c);
				c = snext();
			}
			while (!isEndOfLine(c));
			return res.toString();
		}

		public boolean isSpaceChar(int c) 
		{
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}

		private boolean isEndOfLine(int c)
		{
			return c == '\n' || c == '\r' || c == -1;
		}

		public interface SpaceCharFilter 
		{
			public boolean isSpaceChar(int ch);
		}
	}
}