当前位置:首页 > 题解目录 > 正文内容

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

亿万年的星光4年前 (2021-04-16)题解目录1973

【问题描述】

给定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; 
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】分糖果

【题目描述】小A在生日这天收到了哥哥送来的一盒糖果,这盒糖果共有M个,小A要把这盒糖果放到N个盘子中(允许有盘子不放),请问,有多少种不同的放法?请注意:数值相同,顺序不同,我们视为是相同的放法,比如...

【题解】宴会

【题目描述】今人不见古时月,今月曾经照古人。梦回长安,大唐风华,十里长安花,一日看尽。 唐长安城是当时世界上规模最大、建筑最宏伟、规划布局最为规范化的一座都城。其营建 制度规划布局的特点是规...

字符全排列

【题目描述】给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。我们假设对于小写字母有‘a’ <‘b’ < … <‘y’<‘z’,而且给定的字符串中的字母已经按照...

【题解】阶乘问题

2.阶乘问题(fac.cpp)【题目描述】给定一个正整数n,求出一个最小的整数m并使得m!的末尾连续的0的个数小于n。m!=1*2*3*4*...*m【输入描述】第一行n。【输出描述】一个整数m。【样...

【题解】均分蛋糕

【题解】均分蛋糕

【题目描述】小明的生日要到了!根据习俗,他需要将一些派分给大家。他有 N 个不同口味、不同大小的派。有 F 个朋友会来参加我的派对,每个人会拿到一块派(必须一个...

学生分组

【题目描述】有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界L(L≤R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使N组学生的人数都在[L,R]...