【题解】最大公约数(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({});