//头文件,当然你用万能头也可以
#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;
}