#include <bits/stdc++.h>

using namespace std;

typedef vector<int> big_int;

bool les(big_int a, big_int b)
{
    double A = 0, B = 0;
    for(int i = 1; i < 60; i++)
        A += a[i] * log(i);
    for(int i = 1; i < 60; i++)
        B += b[i] * log(i);
    return A < B;
}

big_int tr(int t)
{
    big_int ret(60);
    for(int i = 2; i * i <= t; i++)
        while(t % i == 0)
            ret[i]++, t /= i;
    if(t)
        ret[t]++;
    return ret;
}

const int mod = 1e9 + 7;

int bpow(int x, int n)
{
    if(n == 0)
        return 1;
    int t = bpow(x, n >> 1);
    if(n % 2 == 0)
        return 1LL * t * t % mod;
    else
        return 1LL * x * t % mod * t % mod;
}

int get(big_int t)
{
    int ret = 1;
    for(int i = 0; i < 60; i++)
        ret = 1LL * ret * bpow(i, t[i]) % mod;
    return ret;
}

main()
{
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    big_int ans[n + 1];
    for(int i = 1; i <= n; i++)
    {
        big_int t(60);
        t[2] = 1000000;
        ans[i] = t;
    }
    map<big_int, int> lens;
    for(int i = 0; i < n; i++)
    {
        int t;
        cin >> t;
        big_int T = tr(t);
        map<big_int, int> nlens;
        nlens[T] = 1;
        for(auto it: lens)
        {
            big_int TT = T;
            for(int i = 0; i < 60; i++)
                TT[i] = max(TT[i], it.first[i]);
            nlens[TT] = max(nlens[TT], it.second + 1);
        }
        lens = nlens;
        for(auto it: lens)
            if(les(it.first, ans[it.second]))
                ans[it.second] = it.first;
    }
    for(int i = n - 1; i; i--)
        if(les(ans[i + 1], ans[i]))
            ans[i] = ans[i + 1];
    int ANS[n + 1];
    for(int i = 1; i <= n; i++)
        ANS[i] = get(ans[i]);
    while(q--)
    {
        int x;
        cin >> x;
        cout << ANS[x] << "\n";
    }

}