青少年编程知识记录 codecoming

【题解】最大公约数(2019青岛市程序设计竞赛)

【问题描述】

给定n,以及正整数序列a1,a2,…,an与b1,b2,…,bn。

令:

sa=a1*a2*…*an

sb=b1*b2*…*bn

求sa和sb的最大公约数gcd(sa,sb)。

【输入】

第一行n。

第二行,序列a1,a2,…,an。两个数之间用空格隔开。

第三行,序列b1,b2,…,bn。两个数之间用空格隔开。

【输出】

sa和sb的最大公约数,结果%10007。

【输入输出样例】

gcd.in

gcd.out

3

12 15   70

20 75   49

2100

【数据范围】

测试点

n范围

ai,bi,sa,sb

1

1<=n<=5

1<=ai,bi<=10000;

sa,sb<109

2

3

4

10<=n<=100

1<=ai,bi<=10000;

sa,sb<10400

5

6

7

8

9

10





【来源】

2019年青岛市程序设计竞赛试题(初中组)2T

  • 题目的难点在于数据范围和最大公约数的求法。

  • 关于最大公约数的求法,可以参见最大公约数求法

  • 取余这个操作用公式:(a*b)%p =(a%p * b%p) %p

  • 数据范围要用long long






【参考答案】

#include<bits/stdc++.h>  using namespace std;  long long n,sa[101],sb[101],ans=1;   //求最大公约数   long long gcd(long a,long b)  {      if(b==0)          return a;      return gcd(b,a%b);  }   int main()  {      cin>>n;      for(int i=0;i<n;i++)      {          cin>>sa[i];      }      for(int i=0;i<n;i++)      {          cin>>sb[i];      }      for(int i=0;i<n;i++)      {          for(int j=0;j<n;j++)          {              long long devisor=gcd(sa[i],sb[j]); //求最大公约数               sa[i]/=devisor;  	    sb[j]/=devisor; //约分               ans*=devisor;   //sa与sb的最大公约数等于他们每一项的最大公约数相乘               ans%=10007; //取模               if(sa[i]==1)              break;          }      }      cout<<ans%10007;      return 0;   }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:题解目录 浏览: