// Original C++ solution (slower):
#include "bits/stdc++.h"

using namespace std;

#ifndef LOCAL

#define endl '\n'

#endif



#define fr(i, a, b) for(int i = a; i <= b; i++)

#define rf(i, a, b) for(int i = a; i >= b; i--)

#define pf push_front

#define pb push_back

#define eb emplace_back

#define fi first

#define se second

#define all(x) x.begin(), x.end()

#define rall(x) x.rbegin(), x.rend()

#define sz(x) (int)x.size()

#define lb lower_bound

#define ub upper_bound



typedef long long ll;

typedef long double f80;

typedef pair<int,int> pii;

typedef pair<ll,ll> pll;



int pct(int x) { return __builtin_popcount(x); }

int pct(ll x) { return __builtin_popcountll(x); }

int bt(int x) { return 31 - __builtin_clz(x); } // floor(log2(x))

int bt(ll x) { return 63 - __builtin_clzll(x); } // floor(log2(x))

int cdiv(int a, int b) { return a / b + !(a < 0 || a % b == 0); }

ll cdiv(ll a, ll b) { return a / b + !(a < 0 || a % b == 0); }

int nxt_C(int x) { int c = x & -x, r = x + c; return (((r ^ x) >> 2) / c) | r; }

ll nxt_C(ll x) { ll c = x & -x, r = x + c; return (((r ^ x) >> 2) / c) | r; }



vector<int> get_bits(int mask) {

	vector<int> bb;

	while(mask) { int b = bt(mask); bb.pb(b); mask ^= (1 << b); }

	reverse(all(bb));

	return bb;

}



int get_mask(vector<int> v) {

	int mask = 0;

	for(int x : v) { mask ^= (1 << x); }

	return mask;

}



template<typename T>

void uniq(vector<T> &v) { sort(all(v)); v.resize(unique(all(v)) - v.begin()); }



mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());



ll rand(ll l, ll r){

	uniform_int_distribution<ll> uid(l, r);

	return uid(rng);

}



void sc() {}



template <typename Head, typename... Tail>

void sc(Head &H, Tail &... T) { cin >> H; sc(T...); }



#ifdef LOCAL

#define debug(...) cerr << "[L:" << __LINE__ << "][" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

#else

#define debug(...) 42

#endif



// #ifndef LOCAL

// string to_string(__int128 x) {

// 	string s = "";

// 	bool neg = 0;

// 	if(x < 0) { s += "-"; neg = 1; x = -x; }

// 	if(!x) s += '0';

// 	while(x) {

// 		int rem = x % 10;

// 		s += to_string(rem);

// 		x /= 10;

// 	}

// 	reverse(s.begin() + neg, s.end());

// 	return s;

// }

// #endif



const int mod = 1e9 + 7; // 998244353;



int pwr(int a,ll b) {

	int ans = 1;

	while(b) {

		if(b & 1) ans = (ans * 1LL * a) % mod;

		a = (a * 1LL * a) % mod;

		b >>= 1;

	}

	return ans;

}



/*

	Lookout for overflows!!

	Check array sizes!!

	Clear before test cases!!

	Use the correct modulo!!

	Check for corner cases!!

	Are you forgetting something?!

	Read problem statement carefully!!!

*/



const int N = 1005;

char a[N][N];



int ch_cnt[26];



int n, m;

void go(int k) {

    int pt = 0;

    fr(i, 1, (n + 1) / 2) {

        fr(j, 1, (m + 1) / 2) {

            int c = 1;

            if(i < n - i + 1) c *= 2;

            if(j < m - j + 1) c *= 2;

            if(c != k) continue;

            debug(i, j, c);

            while(pt < 26 && ch_cnt[pt] < k) pt++;

            if(pt == 26) {

                cout << "No";

                exit(0);

            }

            ch_cnt[pt] -= k;

        }

    }

}



void solve() {

    sc(n, m);

    fr(i, 1, n) {

        fr(j, 1, m) {

            sc(a[i][j]);

            ch_cnt[a[i][j] - 'a']++;

        }

    }

    go(4);

    go(2);

    go(1);

    cout << "Yes";

}



int main() {

	ios :: sync_with_stdio(0);

	cin.tie(0);

	cout.tie(0);

	int t = 1;

	// cin >> t;

	for(int tt = 1; tt <= t; tt++) {

		solve();

	}

	return 0;

}

// Optimized solution to the same problem (faster):
#include <cstdio>



char str[110][110];

int ct[130];



int main() {

	int n, m;

	scanf("%d%d", &n, &m);

	for (int i = 0; i < n; ++i)

		scanf("%s", str + i);

	for (int i = 0; i < n; ++i)

		for (int j = 0; j < m; ++j)

			++ct[str[i][j]];

	bool flag = 1;

	if (n % 2 == 0 && m % 2 == 0) {

		for (int i = 0; i < 130; ++i)

			if (ct[i] % 4)

				flag = 0;

	}

	else if (n % 2 == 0 || m % 2 == 0) {

		int cA = 0;

		for (int i = 0; i < 130; ++i)

			if (ct[i] % 4) {

				if (ct[i] % 4 != 2)

					flag = 0;

				++cA;

			}

		if (m % 2 == 0 && cA > m / 2 || n % 2 == 0 && cA > n / 2) flag = 0;

	}

	else {

		int cA = 0, cB = 0;

		for (int i = 0; i < 130; ++i)

			if (ct[i] % 4) {

				if (ct[i] % 4 == 3) ++cA, ++cB;

				if (ct[i] % 4 == 1) ++cA;

				else ++cB;

			}

		if (cA != 1 || cB > m / 2 + n / 2) flag = 0;

	}

	puts(flag ? "Yes" : "No");

	return 0;

}


// Fastest known solution for this problem: