Fox Ciel has a robot on a 2D plane. Initially it is located in (0, 0). Fox Ciel code a command to it. The command was represented by string s. Each character of s is one move operation. There are four move operations at all:

  * 'U': go up, (x, y)  →  (x, y+1); 
  * 'D': go down, (x, y)  →  (x, y-1); 
  * 'L': go left, (x, y)  →  (x-1, y); 
  * 'R': go right, (x, y)  →  (x+1, y). 



The robot will do the operations in s from left to right, and repeat it infinite times. Help Fox Ciel to determine if after some steps the robot will located in (a, b).

Input

The first line contains two integers a and b, ( - 109 ≤ a, b ≤ 109). The second line contains a string s (1 ≤ |s| ≤ 100, s only contains characters 'U', 'D', 'L', 'R') — the command.

Output

Print "Yes" if the robot will be located at (a, b), and "No" otherwise.

Examples

Input

2 2
RU


Output

Yes


Input

1 2
RU


Output

No


Input

-1 1000000000
LRRLU


Output

Yes


Input

0 0
D


Output

Yes

Note

In the first and second test case, command string is "RU", so the robot will go right, then go up, then right, and then up and so on.

The locations of its moves are (0, 0)  →  (1, 0)  →  (1, 1)  →  (2, 1)  →  (2, 2)  →  ...

So it can reach (2, 2) but not (1, 2).
import static java.lang.System.*;
import static java.lang.Math.*;

import java.lang.reflect.Array;
import java.util.*;
import java.util.Map.Entry;

public class A322{
    public static Scanner sc = new Scanner(in);
    //public static Random sc=new Random();
    public void run(){
        int a=sc.nextInt(),b=sc.nextInt();
        char[] s=sc.next().toCharArray();

        int n=s.length;
        int[] mx=new int[n+1];
        int[] my=new int[n+1];
        mx[0]=my[0]=0;
        for(int i=1;i<=n;i++){
            switch(s[i-1]){
            case 'U':
                mx[i]=mx[i-1];
                my[i]=my[i-1]+1;
                break;
            case 'D':
                mx[i]=mx[i-1];
                my[i]=my[i-1]-1;
                break;
            case 'L':
                mx[i]=mx[i-1]-1;
                my[i]=my[i-1];
            break;
            case 'R':
                mx[i]=mx[i-1]+1;
                my[i]=my[i-1];
                break;
            }
        }

        for(int i=0;i<n;i++){
            if(mx[n]!=0 && my[n]!=0){
                int xt=(a-mx[i])/mx[n];
                int yt=(b-my[i])/my[n];
                if((a-mx[i])%mx[n]==0 && (b-my[i])%my[n]==0
                    && xt==yt && xt>=0 && yt>=0){
                    ln("Yes");return;
                }
            }else if(my[n]!=0){
                int yt=(b-my[i])/my[n];
                if(a==mx[i] && (b-my[i])%my[n]==0 && yt>=0){
                    ln("Yes");return;
                }
            }else if(mx[n]!=0){
                int xt=(a-mx[i])/mx[n];
                if((a-mx[i])%mx[n]==0  && b==my[i] && xt>=0){
                    ln("Yes");return;
                }
            }else{
                if(a==mx[i] && b==my[i]){
                    ln("Yes");return;
                }
            }
        }
        ln("No");
   }
    public static void main(String[] _) {
        new A322().run();
    }
    //output lib
    static final String br=System.getProperty("line.separator");
    static final String[] asep=new String[]{""," ",br,br+br};
    static String str(Boolean o){
        return o?"YES":"NO";
    }
//  static String str(Double o){
//      return String.format("%.8f",o);
//  }
    static <K,V> String str(Map<K, V> map){
        StringBuilder sb=new StringBuilder();
        boolean isFirst=true;
        for(Entry<K,V> set:map.entrySet()){
            if(!isFirst)sb.append(br);
            sb.append(str(set.getKey())).append(":").append(str(set.getValue()));
            isFirst=false;
        }
        return sb.toString();
    }
    static <E> String str(Collection<E> list){
        StringBuilder sb=new StringBuilder();
        boolean isFirst=true;
        for(E e:list){
            if(!isFirst)sb.append(" ");
            sb.append(str(e));
            isFirst=false;
        }
        return sb.toString();
    }

    static String str(Object o){
        int depth=_getArrayDepth(o);
        if(depth>0)return _strArray(o,depth);
        Class<?> c=o.getClass();
        if(c.equals(Boolean.class))return str((Boolean)o);
        //if(c.equals(Double.class))return str((Double)o);

        return o.toString();
    }
    static int _getArrayDepth(Object o){
        if(!o.getClass().isArray() || Array.getLength(o)==0) return 0;
        return  1+_getArrayDepth(Array.get(o,0));
    }
    static String _strArray(Object o,int depth){
        if(depth==0) return str(o);
        StringBuilder sb=new StringBuilder();
        for(int i=0,len=Array.getLength(o);i<len;i++){
            if(i!=0)sb.append(asep[depth]);
            sb.append(_strArray(Array.get(o,i),depth-1));
        }
        return sb.toString();
    }
    static void pr(Object... os){
        boolean isFirst=true;
        for(Object o:os){
            if(!isFirst)out.print(" ");
            out.print(o);
            isFirst=false;
        }
    }
    static void ln(){
        out.println();
    }
    static void ln(Object... os){
        for(Object o:os){
            pr(o);ln();
        }
    }
}    
