hdu 数字游戏

数字游戏续

Problem Description

自从小艾上次在和小牛的游戏中取得了信心之后,这次他又想到了一个问题,他要去计算两个数A和B的最大公约数。
由于这两个数非常的大,于是小牛把数字A拆成了N个数,这N个数相乘的结果是A,把B拆成了M个数,同样这M个数的乘积等于B,小艾迫不及待地想去计算出这两个数的最大公约数,这次你能帮帮他吗?如果结果超过了9位数,输出最后的9位数。

Input

输入有多组数据。
第一行包含一个正整数N ( 1 <= N <= 1000 )。
第二行包含N个以空格隔开的小于 1 000 000 000的正整数,它们的乘积是A。
第三行包含一个正整数M ( 1 <= M <= 1000 )。
第四行包含M个以空格隔开的小于 1 000 000 000的正整数,它们的乘积是B。

Output

输出A和B的最大公约数,如果结果超过了9位数,输出后9位。

Sample Input

3
2 3 5
2
4 5
4
6 2 3 4
1
1
3
358572 83391967 82
3
50229961 1091444 8863

Sample Output

10
1
000012028

Source

2012暑假集训
数据范围n*m=1000*1000采用暴力,另外前导零可以使用printf("%0*I64d\n",u,res1);(其中u赋值9);或printf("%09I64d\n",res1);
AC代码

#include <stdio.h>
#define LL __int64
#define maxn 100000
#define mod 1000000000
LL a[maxn],b[maxn];
LL c[maxn];
LL gcd( LL x,LL y)
{
return x%y?gcd(y,x%y):y;
}
int main( )
{
int i,n,j,m;

while(scanf("%d",&n)==1)
{
for( i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
scanf("%d",&m);
for( i=1;i<=m;i++)
{
scanf("%I64d",&b[i]);
}

LL res1=1,res;
int flag=1;
for( i=1;i<=n;i++)
{

for( j=1;j<=m;j++)
{
res=gcd(a[i],b[j]);
res1*=res;
if(res1>mod) {//防止超出范围
res1%=mod;
flag=0;
}
a[i]/=res;
b[j]/=res;
}
}

if(flag) printf("%I64d\n",res1);
else {

printf("%09I64d\n",res1);
}

}
return 0;
}

链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1009&cid=16309&hide=0

 

posted @ 2012-07-24 16:15  jiai  Views(308)  Comments(0Edit  收藏  举报