#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int s, n;
vector<int> small; //小三角形的边长
bool vis[110][110]; //访问情况
//深搜尝试
bool feasible(int x, int y, int length)
{
if (x + length - 1 > 2 * s || y + 2 * length - 2 > 4 * s) //如果放置,则超出六边形范围
return false;
if (y % 2 == 1) {//放正三角
for (int i = 0; i < length; i++) {
for (int j = 0; j < 2 * i + 1; j++) {
if (vis[x + i][y + j] == false)
return false;
}
}
}
else {//放倒三角
for (int i = 0; i < length; i++) {
for (int j = 2 * i; j < 2 * length - 1; j++) {
if (vis[x + i][y + j] == false)
return false;
}
}
}
return true;
}
//递归前改变状态,表示已访问
void change(int x, int y, int length)
{
if (y % 2 == 1) {//正三角
for (int i = 0; i < length; i++) {
for (int j = 0; j < 2 * i + 1; j++) {
vis[x + i][y + j] = false;
}
}
}
else {//倒三角
for (int i = 0; i < length; i++) {
for (int j = 2 * i; j < 2 * length - 1; j++) {
vis[x + i][y + j] = false;
}
}
}
}
//递归后还原状态
void restore(int x, int y, int length)
{
if (y % 2 == 1) {//正三角
for (int i = 0; i < length; i++) {
for (int j = 0; j < 2 * i + 1; j++) {
vis[x + i][y + j] = true;
}
}
}
else {//倒三角
for (int i = 0; i < length; i++) {
for (int j = 2 * i; j < 2 * length - 1; j++) {
vis[x + i][y + j] = true;
}
}
}
}
bool DFS(int x, int y)
{
if (x > 2 * s)
return true;
if (y > 4 * s)
return DFS(x + 1, 1);
if (vis[x][y] == false)
{
int i;
for (i = y + 1; i <= 4 * s; i++)
{
if (vis[x][i] == true)
break;
}
return DFS(x, i);
}
for (int i = 0; i < n; i++)
{
if (feasible(x, y, small[i]))
{
change(x, y, small[i]);
if (DFS(x, y + 1))
return true;
restore(x, y, small[i]);
}
else //三角形从小往大搜,当某个三角形不能放的时候,直接return
break;
}
return false;
}
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> s >> n;
small.clear();
int num; //小三角形边长
for (int i = 0; i < n; i++)
{
cin >> num;
small.push_back(num);
}
sort(small.begin(), small.end());
for (int i = 0; i < n; i++) //去掉大于六边形边长的小三角形
{
if (small[i] > s)
{
n = i;
break;
}
}
bool success = false;
for (int i = 0; i < n; i++)
{
if (s % small[i] == 0) //如果六边形边长为某个小三角形边长的倍数,则直接YES
{
success = true;
break;
}
else
{
for (int j = 0; j < i; j++)
{
if (small[i] % small[j] == 0) //如果某个小三角形边长是另一个小三角形边长的倍数,则将其去除
{
for (int k = i + 1; k < n; k++)
small[k - 1] = small[k];
n--;
i--;
break;
}
}
}
}
if (success)
{
cout << "YES" << endl;
continue;
}
memset(vis, false, sizeof(vis));
for (int i = 1; i <= s; i++) //从正三角开始,上半部六边形
{
for (int j = 1; j <= 2 * s + 2 * i - 1; j++)
vis[i][j] = true;
}
for (int i = s + 1; i <= 2 * s; i++) //从倒三角开始,下半部六边形
{
for (int j = 2 * i - 2 * s; j <= 4 * s; j++)
vis[i][j] = true;
}
if (DFS(1, 1))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}