rt,
样例都过了,检查了一下也没有什么逻辑问题
求dalao们指点...
所有思路都在注释
#include<iostream>
#include<string>
using namespace std;
long long a[1005] = {},b[1005] = {};
long long gcd(long long x,long long y){//最大公因数
if(y==0) return x;
else return gcd(y,x%y);
}
long long aans=1,bans=1,allans=1;
string allcnt,ansstr;//allcnt存放答案(未经过%mod),ansstr用来判断最后输出几个0
bool mark=0;//mark用来标记答案是否超过9位
long long mod = 1000000000;//这里为了如果超过9位,取后9位
int main(){
//输入
int n,m;
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<=n;++i){
aans %= mod;//同余定理
aans *= (a[i]%mod);
if(mark==0){//如果没到9位
allans *= a[i];//乘上去
allcnt = to_string(allans);//long long转字符串
if(allcnt.length()>9) mark = 1;//如果超过9,标记
}
aans %= mod;
}
for(int i=1;i<=m;++i){//同上
bans %= mod;
bans *= (b[i]%mod);
if(mark==0){
allans *= b[i];
allcnt = to_string(allans);
if(allcnt.length()>9) mark = 1;
}
bans %= mod;
}
int ans = gcd(aans,bans)%mod;//算出答案
ansstr = to_string(ans);//转字符串
//这里因为答案%mod,保留了后9位,所以只要不足9位并且真实超过,前面必定是0占位(不是0 long long无法忽视)
if(mark==1 && ansstr.length()<9){//如果真实答案超过9位 && ans不足9位(前面有0)
for(int i=1;i<=9-ansstr.length();++i){//输出0
cout<<"0";
}
}
cout<<ans<<"\n";//输出答案
return 0;
}