WA
查看原帖
WA
252549
Iwara楼主2023/9/24 14:54

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;
}
2023/9/24 14:54
加载中...