//头文件,当然你用万能头也可以
#include <iostream>
#include <vector>
#include <algorithm>
//gcd函数实现
int gcd(int x, int y) {
//根据欧几里得算法,得知gcd(a,b) = gcd(b,a mod b),所以用代码实现一下就好
while (y != 0) {
int temp = y; //temp作为临时变量存储一下
y = x % y;
x = temp;
}
return x; //得到最大公约数,返回该数值捏
}
int main() {
//你知道的,1e6的数据最好是关一下同步和绑定,IO++.jpg
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int T = 0;
std::cin >> T;
while (T--) {
int n = 0, m = 0;
std::cin >> n >> m;
std::vector<int> a(n); //这个是你要存储的的值
std::vector<int> a_count(n + 1, 0); //这个是统计每个数字出现的次数
std::vector<int> a_end(n + 1, 0); //这个是存储gcd返回的值用的
for (int i = 0; i < n; i++) {
std::cin >> a[i]; //此时,你就可以把数据狠狠的输入进去了
if (a[i] <= n) a_count[a[i]]++; //在 <= n 的范围内,在统计数组的的对应位置++
}
for (int i = 1; i <= n; i++) { //循环一下n的全部值,都拉去检查是否能组成gcd的返回值
for (int j = 1; j * i <= n; j++) { //毕竟是公约数,所以肯定是倍数,那么j从1开始,循环i的倍数就好,莫忘记限制范围哦
int num = j * i; //存储一下i的倍数
if (a_count[num] > 0) { //让我看看该倍数是否在集合中出现,如果出现,那么统计次数肯定大于0
if (a_end[i] == 0) a_end[i] = num; //如果这个时候还是等于0,那么就是第一次出现了,也就是它本身
else a_end[i] = gcd(a_end[i], num); //毕竟是求最大公约数,居然不是第一次,那让我看看!
}
if (a_end[i] == i) break; //都看完了,该走了
}
}
for (int i = 0; i < m; i++) {
int x = 0;
std::cin >> x;
//请不要使用std::endl哦,小心时间跟你爆了
if (x <= n && a_end[x] == x) std::cout << "YES\n"; //那么如果存在该数值,不就有子集了吗,那就回复YES吧
else std::cout << "NO\n"; //没有吗,那就NO吧
}
}
return 0;
}