import std;
import core.bitop;

ulong MAX = 100_100, MOD = 1_000_000_007, INF = 1_000_000_000_000;
alias sread = () => readln.chomp();
alias lread(T = long) = () => readln.chomp.to!(T);
alias aryread(T = long) = () => readln.split.to!(T[]);
alias Pair = Tuple!(long, "money", long, "stack");
alias PQueue(T, alias less = "a>b") = BinaryHeap!(Array!T, less);

void main()
{
    long h, w;
    scan(h, w);
    auto a = new string[](h);
    iota(h).each!(x => a[x] = sread());

    long[char] cntalf;

    foreach (e; a)
    {
        foreach (f; e)
        {
            if (f in cntalf)
                cntalf[f] += 1;
            else
                cntalf[f] = 1;
        }
    }
    long cnt4, cnt2, cnt1;
    foreach (key, value; cntalf)
    {
        cnt4 += value / 4;
        cnt2 += (value - 4 * (value / 4)) / 2;
        cnt1 += value % 2;
    }
    bool check = true;
    long need4 = (h / 2) * (w / 2), need2 = (h % 2) * (w / 2) + (w % 2) * (h / 2),
        need1 = (h % 2) * (w % 2);

    // cnt4.writeln();
    // cnt2.writeln();
    // cnt1.writeln();
    if (need4 > cnt4)
        check = false;

    cnt2 += (cnt4 - need4) / 2;

    if (need2 > cnt2)
        check = false;

    if (need1 > cnt1)
        check = false;

    if (check)
        writeln("Yes");
    else
        writeln("No");
}

void scan(TList...)(ref TList Args)
{
    auto line = readln.split();
    foreach (i, T; TList)
    {
        T val = line[i].to!(T);
        Args[i] = val;
    }
}
