RT
求调/kk
#include<bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5,MAXP=4e6+5,MOD=1e9;
ll n,m;
ll a[MAXN],b[MAXN];
ll prime[MAXP];
bool np[MAXP];
bool np_a[MAXN],np_b[MAXN];
map<ll,bool> vis;
ll tmp_a,tmp_b;
ll fpow(ll X,ll Y){
ll ans=1;
while(Y){
if(Y&1)ans=ans*X%MOD;
X=X*X%MOD;
Y>>=1;
}
return ans;
}
ll count(ll num,ll p){
ll ans=0;
while(num%p==0&&num)num/=p,ans++;
return ans;
}
ll Ans=1,fl;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1;i<=m;i++)vis[b[i]]=1;
for(int i=2;i<=5e4;i++){
if(!np[i])prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]*i<=5e4;j++){
np[prime[j]*i]=1;
if(i%prime[j]==0)continue;
}
}
for(int i=1;i<=prime[0];i++){
tmp_a=tmp_b=0;
for(int j=1;j<=n;j++){
tmp_a+=count(a[j],prime[i]);
if(count(a[j],prime[i]))np_a[j]=1;
}
for(int j=1;j<=m;j++){
tmp_b+=count(b[j],prime[i]);
if(count(b[j],prime[i]))np_b[j]=1;
}
Ans*=fpow(prime[i],min(tmp_a,tmp_b));
if(Ans>=MOD)fl=1,Ans%=MOD;
}
for(int i=1;i<=n;i++)if(!np_a[i]&&vis[a[i]]){
Ans*=a[i];
if(Ans>=MOD)fl=1,Ans%=MOD;
}
if(fl)printf("%09lld",Ans);
else cout<<Ans;
return 0;
}