【题目来源】
https://www.luogu.com.cn/problem/P13014
【题目描述】
对于两个正整数 ,他们的最大公因数记为
。对于
个正整数
,他们的最大公因数为:
给定 个正整数
以及
组询问。对于第
组询问,请求出
的最大公因数,也即
。
【输入格式】
第一行,两个正整数 ,分别表示给定正整数的数量,以及询问组数。
第二行, 个正整数
。
【输出格式】
输出共 行,第
行包含一个正整数,表示
的最大公因数。
【输入样例】
5 3
6 9 12 18 30
【输出样例】
1
1
3
【说明/提示】
对于 60% 的测试点,保证 1≤n≤10^3,1≤q≤10。
对于所有测试点,保证 1≤n≤10^5,1≤q≤10^5,1≤ai≤1000。
【算法分析】
● "辗转相除法"求最大公约数:https://blog.csdn.net/hnjzsyjyj/article/details/145671149
● 最大公约数性质:
【算法代码】
cpp
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int n,q,t;
int gcd(int a,int b) {
if(b==0) return a;
return gcd(b,a%b);
}
int main() {
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
for(int i=2; i<=n; i++) {
t=gcd(t,a[i]-a[i-1]);
}
for(int i=1; i<=q; i++) {
printf("%d\n",gcd(t,a[1]+i));
}
return 0;
}
/*
in:
5 3
6 9 12 18 30
out:
1
1
3
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/145671149
https://blog.csdn.net/hnjzsyjyj/article/details/136276606