题目概述:
给定两个正整数序列a1,a2…,an与b1,b2…,bm.
对于每个j=1,2,3,…,m计算a1+bj,a2+bj,…,an+bj的最大公约数.
输入:
第一行两个整数n和m.
第二行包含n个整数表示a1,a2…an.
第三行包含m个整数表示b1,b2…bm.
输出:
一行,m个正整数,第j个整数 表示gcd(a1+bj,a2+bj, …,an+bj).
样例输入:
4 4
1 25 121 169
1 2 7 23
样例输出:
2 3 8 24
数据范围:
30%数据满足:1≤n,m≤2×10^3.
100%数据满足:1≤n,m≤2×10^5, 1≤ai,bj≤10^18.
题目分析->
相关知识->最小公倍数【gcd】
代码标程:【AC】
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
int n,m;
ll ans,a[200050],b,det[200050];
int main()
{
scanf("%d %d",&n,&m);
for(int i=n; i>=1; i--)
{
scanf("%lld",&a[i]);
}
for(int i=n;i>=2;i--)
{
det[i]=a[i]-a[i-1];
ans=__gcd(ans,det[i]);
}
for(int j=1;j<=m;j++)
{
scanf("%lld",&b);
printf("%lld ",abs(__gcd(ans,a[1]+b)));
}
return 0;
}
备注:
__gcd(a,b) 为
调用STL ——即求
a与b的最大公约数