题目描述
Mirko最近收到了一个家庭作业,作业的任务是计算两个数A和B的最大公约数。由于这两个数太大了,我们给出了N个数,他们的乘积是A,给出M个数,他们的乘积是B。
Mirko想要验算自己的答案,所以他想找你写一个程序来解决这个问题。如果这个最大公约数超过了9位数,那么只需要输出最后9位就可以了。
输入
第一行包含一个正整数N,范围是1到1000。第二行是N个用空格隔开的正整数(小于10亿),他们的乘积是A。第三行包含一个正整数M,范围是1到1000。第四行是M个用空格隔开的正整数(小于10亿),他们的乘积是B。
输出
输出有且只有一行,表示A和B的最大公约数,如果结果超过了9位数,输出最后9位数就可以了。
提示
解题思路
第二个序列中的数和第一个序列的数求最大公因数,然后乘起来
乘完要把求最大公因数的两个数都除以求出的最大公因数,避免重复
比如:
第一个序列:8
第二个序列:4 4
那么第一个4和8求出最大公因数是4,如果8不除以4,那么最终答案会从8变成16
#include<iostream>
#include<cstdio>
using namespace std;
const long long Mod=1000000000;
int n,m,t;
long long a[2000],x,Gun=1,ans;
long long demo(long long x,long long y){
if(x%y==0)return y;
else return (demo(y,x%y));
}
int main(){
//freopen("zadaca.in","r",stdin);
//freopen("zadaca.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%lld",&x);
for(int j=1;j<=n;j++){
if(!a[j])continue;//如果之前被除成0,那辗转相除时会出错
ans=demo(x,a[j]);
if(Gun*ans>=Mod)t=1;//对输出的标记
Gun=(Gun*ans)%Mod;
x/=ans,a[j]/=ans;
}
}
if(t)printf("%09lld",Gun);
else printf("%lld",Gun);
}