(File IO): input:zadaca.in output:zadaca.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
最近收到了一个家庭作业,作业的任务是计算两个数
和
的最大公约数。由于这两个数太大了,我们给出了
个数,他们的乘积是
,给出
个数,他们的乘积是
。
想要验算自己的答案,所以他想找你写一个程序来解决这个问题。如果这个最大公约数超过了
位数,那么只需要输出最后
位就可以了。
输入
第一行包含一个正整数
,范围是
到
。第二行是
个用空格隔开的正整数(小于
亿),他们的乘积是
。第三行包含一个正整数M,范围是
到
。第四行是M个用空格隔开的正整数(小于
亿),他们的乘积是
。
输出
输出有且只有一行,表示 和 的最大公约数,如果结果超过了 位数,输出最后 位数就可以了。
样例输入输出
数据范围限制
无
提示
无
解题思路
先输入第一个数组,不作处理,再输入1~~m个数,每输入一个数跟第一个数组每个数求最大公约数,和
相乘,
同时
。相乘以后,两个数都要除以它们的最大公约数,避免重复乘了。
怎么输出前导零?
在
乘最大公约数时,用一个
标记一下,输出时,若
便printf(“%09ld”,
代码
#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);
}