#include <bits/stdc++.h>

using namespace std;

#define STREAM_IO ios_base::sync_with_stdio(false)
#define STREAM_IO_BUFFERED cin.tie(0); cout.tie(0)

typedef long long ll;
#define LL (ll)
typedef unsigned int uint;
#define UINT (uint)
typedef unsigned long long ull;
#define ULL (ull)

typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
#define mp make_pair

template <class T1, class T2> inline istream &operator>>(istream &in, pair <T1, T2> &pr) { in >> pr.first >> pr.second;	return in; }
template <class T1, class T2> inline ostream &operator<<(ostream &out, const pair <T1, T2> &pr) { out << pr.first << ' ' << pr.second; return out; }

typedef vector <int> vi;
typedef vector <ll> vl;
#define pb push_back
#define ppb pop_back
#define clr clear

template <class T> inline istream &operator>>(istream &in, vector <T> &v) { for (T &x : v) in >> x; return in; }
template <class T> inline ostream &operator>>(ostream &out, const vector <T> &v) { for (T &x : v) out << x << ' '; return out; }

template <class T> inline istream &operator>>(istream &in, set <T> &v) { T x; in >> x; v.insert(x); return in; }
template <class T> inline ostream &operator>>(ostream &out, set <T> &v) { for (T &x : v) out << x << ' '; return out; }

template <class T> inline istream &operator>>(istream &in, multiset <T> &v) { T x; in >> x; v.insert(x);  return in; }
template <class T> inline ostream &operator>>(ostream &out, multiset <T> &v) { for (T &x : v) out << x << ' '; return out; }

template <class T> void Write(const vector <T> &v, char c = ' ') { for (const T &x : v) cout << x << c; }
template <class T> void Writeln(const vector <T> &v, char c = ' ') { for (const T &x : v) cout << x << c; cout << char(10); }

template <class T> void Write(set <T> &v, char c = ' ') { for (const T &x : v) cout << x << c; }
template <class T> void Writeln(set <T> &v, char c = ' ') { for (const T &x : v) cout << x << c; cout << char(10); }

template <class T> void Write(multiset <T> &v, char c = ' ') { for (const T &x : v) cout << x << c; }
template <class T> void Writeln(multiset <T> &v, char c = ' ') { for (const T &x : v) cout << x << c; cout << char(10); }

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

ll gcd(ll a, ll b) { while (b) { a %= b; swap(a, b); } return a; }
int gcd(int a, int b) { while (b) {	a %= b;	swap(a, b);	} return a; }

#define bitscnt(U) __builtin_popcountll(LL (U))

#define SZ(U) int((U).size())
#define all(U) (U).begin(), (U).end()
#define rall(U) (U).rbegin(), (U).rend()
#define imin(U) (U).begin()
#define gmin(U) (*imin(U))
#define imax(U) (--(U).end())
#define gmax(U) (*imax(U))
#define REV(U) reverse(all(U))
#define SORT(U) sort(all(U))
#define CLR(U) memset(U, 0, sizeof U)
#define ONES(U) memset(U, -1, sizeof U)
#define CPY(FROM, TO) memcpy(TO, FROM, sizeof TO)

void solve()
{
	int cnt[26];
	CLR(cnt);
	int n, m;
	cin >> n >> m;
	for (int i(1); i <= n; ++i)
		for (int j(1); j <= m; ++j)\
		{
			char c;
			cin >> c;
			++cnt[c - 'a'];
		}
	int p4(0), p2(0), p1(0);
	if ((n & 1) && (m & 1))
	{
		p1 = 2;
		p4 = n * m - n - m + 1;
		p2 = m + n - 2;
	}
	else if (n & 1)
	{
		p1 = 0;
		p4 = n * m - m;
		p2 = m;
	}
	else if (m & 1)
	{
		p1 = 0;
		p4 = n * m - n;
		p2 = n;
	}
	else
	{
		p1 = p2 = 0;
		p4 = n * m;
	}
	for (int i(0); i < 26; ++i)
		while (cnt[i] >= 4 && p4)
		{
			cnt[i] -= 4;
			p4 -= 4;
		}
	for (int i(0); i < 26; ++i)
		while (cnt[i] >= 2 && p2)
		{
			cnt[i] -= 2;
			p2 -= 2;
		}
	for (int i(0); i < 26; ++i)
		while (cnt[i] >= 1 && p1)
		{
			p1 -= 1;
			cnt[i] -= 1;
		}
	for (int i(0); i < 26; ++i)
		if (cnt[i]){
			cout << "No\n";
			return;
		}
	cout << "Yes\n";
}

int main()
{
	//freopen("input.txt", "r", stdin);
	STREAM_IO;
	STREAM_IO_BUFFERED;
	solve();
	return 0;
}


Measured memory_bytes: 256