#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
void read(int &res)
{
res=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while('0'<=ch&&ch<='9') res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
}
const int N=1e6+10,M=2010,B=14,full=16384+10,L=310;
const ll mod=998244353;
int n,m,prime[M+10],a[N+10],id[M+10],p[M+10],c[L+10][full+10],d[M+10];
ll f[full+10],Pow[N+10];
ll ksm(ll a,ll b)
{
if(b==0) return 1;
ll tmp=ksm(a,b>>1);
if(b&1) return tmp*tmp%mod*a%mod;
else return tmp*tmp%mod;
}
void Add(ll &a,ll b){a+=b;if(a>=mod) a-=mod;}
bool vis[M+10];
void init()
{
for(int i=2;i<=M;i++)
{
if(!vis[i]) prime[++prime[0]]=i,id[i]=prime[0];
for(int j=1;j<=prime[0]&&i*prime[j]<=M;j++)
{
vis[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
for(int i=1;i<=B;i++)
for(int j=prime[i];j<=M;j+=prime[i])
p[j]|=(1<<i-1);
}
int main()
{
init();
read(n);
ll inv2=ksm(2ll,mod-2);
Pow[0]=1;for(int i=1;i<=n;i++) Pow[i]=Pow[i-1]*inv2%mod;
ll res=ksm(Pow[n],mod-2);
for(int i=1,x;i<=n;i++) read(x),d[x]++;
for(int i=1;i<=prime[0];i++)
for(int s=0;s<=full;s++)
for(int k=prime[i];k<=M;k+=prime[i])
if(!(p[k]&s))
c[i][s]+=d[k];
read(m);
for(int l;m--;)
{
read(l);
f[0]=1;for(int s=1;s<=full;s++) f[s]=0;
for(int i=1;i<=l;i++) read(a[i]);
sort(a+1,a+1+l);
for(int i=1,x;i<=l;i++)
{
x=a[i],x=id[x];
for(int s=full;s>=0;s--)
{
if(!f[s]) continue;
if(x<=B) Add(f[s|(1<<x-1)],mod-f[s]*Pow[c[x][s]]%mod);
else Add(f[s],mod-f[s]*Pow[c[x][s]]%mod);
}
}
ll ans=0;
for(int s=0;s<=full;s++) Add(ans,f[s]);
printf("%lld\n",ans*res%mod);
}
return 0;
}
如果把给a数组排序那一行注释掉就会wa,我感觉这并没有什么关键作用