题目链接点这里
本题是一个数学题。考点在于最大公约数的性质。由于数据量大,因此本题需要一个时间复杂度为 O ( N ) O(N)O(N) 的算法。
更相减损术:gcd(a,b)=gcd(a,b-a).
根据题意化简式子得:
于是先求出后面:sum=
再对每一个bj我们直接求
就可以优化时间
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
typedef long long ll;
ll a[200010];
ll b[200010];
int main()
{
ll n,m,k;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
ll sum=0;
for(int i=2;i<=n;i++)
{
sum=__gcd(sum,abs(a[i]-a[i-1]));
}
ll ans=0;
for(int i=1;i<=m;i++)
{
ans=__gcd(a[1]+b[i],sum);
cout<<ans<<" ";
}
return 0;
}