【题目来源】
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
● 最大公约数性质:
【算法代码】
#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 30out:
1
1
3
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/145671149
https://blog.csdn.net/hnjzsyjyj/article/details/136276606