Codeforces Round #691 (Div. 1).A

88 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
本文已参与「新人创作礼」活动,一 起开启掘金创作之路。
A. Row GCD
屏幕截图 2022-10-03 212628.png

题意
给你两个正整数序列a1,...,an和b1,...,bm。对于每个j=1,...,m,求a1+bj,...,an+bj的最大公约数。

解法
因为gcd(x,y)==gcd(x,yx)gcd(x,y) == gcd(x, y - x) 所以gcd(a1+x,a2+x,a3+x....,an+x)=gcd(a1+x,a2a1,a3a1,....,anan1)gcd(a1+x,a2+x,a3+x....,an + x)=gcd(a1+x,a2−a1,a3−a1,....,an - an-1)

由此可见
我们只需要先处理gcd(a2a1,a3a2,...,anan1)gcd(a2-a1,a3-a2,...,an-an-1)
然后对于与每次的bi请求只用求与a1+x的gcd即可
Code

int a[N];
void solve()
{
   int n,m; cin >> n >> m;
   rep(i,n) cin >> a[i];
   int gcd = a[2] - a[1];
   if(n == 1) {
      rep(i,m) {
        int x; cin >> x;
        cout << x + a[1] << ' ';
      }
      cout << endl;
      return;
   }
   rep(i,n-1) gcd = __gcd(gcd,a[i+1]-a[i]);
   rep(i,m) {
     int x; cin >> x;
      cout << abs(__gcd(gcd,a[1] + x)) << ' ';
   }
   cout << endl;
}