(File IO): input:zadaca.in output:zadaca.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
M
i
r
k
o
Mirko
Mirko最近收到了一个家庭作业,作业的任务是计算两个数
A
A
A和
B
B
B的最大公约数。由于这两个数太大了,我们给出了
N
N
N个数,他们的乘积是
A
A
A,给出
M
M
M个数,他们的乘积是
B
B
B。
M
i
r
k
o
Mirko
Mirko想要验算自己的答案,所以他想找你写一个程序来解决这个问题。如果这个最大公约数超过了
9
9
9位数,那么只需要输出最后
9
9
9位就可以了。
输入
第一行包含一个正整数
N
N
N,范围是
1
1
1到
1000
1000
1000。第二行是
N
N
N个用空格隔开的正整数(小于
10
10
10亿),他们的乘积是
A
A
A。第三行包含一个正整数M,范围是
1
1
1到
1000
1000
1000。第四行是M个用空格隔开的正整数(小于
10
10
10亿),他们的乘积是
B
B
B。
输出
输出有且只有一行,表示 A A A和 B B B的最大公约数,如果结果超过了 9 9 9位数,输出最后 9 9 9位数就可以了。
样例输入输出
数据范围限制
无
提示
无
解题思路
先输入第一个数组,不作处理,再输入1~~m个数,每输入一个数跟第一个数组每个数求最大公约数,和
a
n
s
ans
ans相乘,
a
n
s
ans
ans同时
%1000000000
。相乘以后,两个数都要除以它们的最大公约数,避免重复乘了。
怎么输出前导零?
在
a
n
s
ans
ans乘最大公约数时,用一个
b
o
o
l
f
bool f
boolf标记一下,输出时,若
f
=
=
1
f==1
f==1便printf(“%09ld”,
a
n
s
)
;
ans);
ans);
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m;
bool f;
long long a[1010],b,c,ans;
long long ys(long long x,long long y)
{
if(x%y==0) return y;
else return ys(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);
ans=1;
for(int i=1; i<=m; i++)
{
scanf("%lld",&b);
for(int j=1; j<=n; j++)
{
c=ys(a[j],b);
if(ans*c>=1000000000)
f=1;
ans=ans*c%1000000000;
a[j]/=c;
b/=c;
}
}
if(f==1)
printf("%09ld",ans);
else
printf("%d",ans);
}