首页 > 其他分享 >abc254 F - Rectangle GCD

abc254 F - Rectangle GCD

时间:2023-01-12 17:35:56浏览次数:68  
标签:pre GCD int 19 w1 logn abc254 Rectangle gcd

题意:

给定等长的正整数组 \(a[],b[]\),它们确定了一个矩阵 \(A_{i,j} = a_i+b_j\)。\(q\) 次询问,回答矩阵中一个矩形区域内所有数的 \(\gcd\)

\(n,q\le 2e5\)

思路:

差分,绝对值,st表区间 gcd
\(\gcd(a_1, a_2, a_3, \cdots ) = \gcd(a_1, a_2-a_1, a_3-a_2, \cdots )\)

写代码注意套个绝对值

证明:

\(\gcd(x,y) = \gcd (x-y, y), x>y\) 对大小有要求,不妨换条路走

若 \(g|a,g|b\) 则 \(g|a+b, g|abs(a-b)\),所以等式两边的因数相同

题解见 https://zhuanlan.zhihu.com/p/524503584

const signed N = 3e5 + 5;
int n, q, a[N], b[N];
int logn[N], f[N][19], g[N][19];
void initlog() {
    logn[1] = 0, logn[2] = 1;
    for(int i = 3; i < N; i++)
        logn[i] = logn[i >> 1] + 1;
}
void pre(int f[N][19]) {
    for(int j = 1; j < 19; j++)
        for(int i = 1; i + (1 << j) - 1 <= n; i++)
            f[i][j] = __gcd(f[i][j - 1], f[i+(1<<(j-1))][j - 1]);
}
int ask(int f[N][19], int l, int r) {
    if(l > r) return 0;
    int k = logn[r - l + 1];
    return __gcd(f[l][k], f[r+1-(1<<k)][k]);
}
void sol() {
    initlog(); //预处理log2
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
        cin >> a[i], f[i][0] = abs(a[i] - a[i - 1]);
    for(int i = 1; i <= n; i++)
        cin >> b[i], g[i][0] = abs(b[i] - b[i - 1]);
    pre(f), pre(g);
    while(q--) {
        int h1, h2, w1, w2;
        cin >> h1 >> h2 >> w1 >> w2;
        int ans = __gcd(ask(f, h1 + 1, h2), ask(g, w1 + 1, w2));
        cout << __gcd(ans, a[h1] + b[w1]) << '\n';
    }
}

标签:pre,GCD,int,19,w1,logn,abc254,Rectangle,gcd
From: https://www.cnblogs.com/wushansinger/p/17047295.html

相关文章

  • Apple开发_使用 GCDAsyncUdpSocket 发送组播消息报错"No route to host"的解决
    1、问题描述苹果手机升级到ios14.5系统后,使用GCDAsyncUdpSocke发送组播消息的时候,发现报错了,ErrorDomain=NSPOSIXErrorDomainCode=65"Noroutetohost"UserInfo=......
  • [ABC254Ex] Multiply or Divide by 2 题解
    [ABC254Ex]MultiplyorDivideby2Solution目录[ABC254Ex]MultiplyorDivideby2Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题......
  • 扩展欧几里得(exgcd(a,b))
    回顾       由贝祖定理可知:ax+by=gcd(a,b)       (a,y)为一组解      (x+kb,y-ka)也为解       所以有无数组解一、扩展欧几里得算法......
  • gcd(a, b, c) = gcd(gcd(a, b), c)
    某一天,我正苦逼的刷题看题解,看到下面的代码inttmp=0; for(inti=1;i<=n;++i){ scanf("%d",&a[i]); tmp=gcd(tmp,a[i]); }​ 我心中一惊:wc,这就能求gcd(a1,a2......
  • P2398 GCD SUM——欧拉函数
    此题可以拓展为\(\sum\limits^n_{i=1}\sum\limits^m_{j=1}\gcd(i,j)\)结论是\(\sum\limits^{\min(n,m)}_{d=1}\varphi(d)\lfloor\dfrac{n}{d}\rfloor\lfloor\dfrac{m}{......
  • Trick 5: 关于 GCD 的一些处理方法和性质
    经典的mobius:\(\varepsilon(x)=\sum\limits_{d|x}\mu(d)\)经典的euler:\(x=\sum\limits_{d|x}\varphi(d)\)处理区间问题。如果考虑一段区间的\(\gcd\),那......
  • 容斥原理与gcd的问题
    gcd个数的处理(i,j无限制)P2398GCDSUMi为1-n,j为1-m,求gcd为k的个数代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintM=1e5+5;......
  • AtCoder-abc230_g GCD Permutation 容斥
    J-GCDPermutation传送门:J-GCDPermutation知识点:素数筛、容斥定理、gcd题意:长度为n的一个排列a中,求满足\(gcd(i,j)!=1且gcd(a_i,a_j)!=1\)的i,j对数。i,j可以......
  • Codeforces 983 D Arkady and Rectangles 题解
    题目链接挺有意思的数据结构题,题面看着像个板子,其实还是有不少学问的。平面上一堆矩形的题目常见套路就是对\(x\)轴扫描线,\(y\)轴线段树维护,这题也不例外。我们先对坐标......
  • New Year Concert ( st表 + gcd +二分/ 朴素做法来找思路)
      思路:可以先想朴素的做法来看看找找思路可以发现gcd的元素越多,这个值就会越小,是单调的而且当某个元素不符合时,最优做法:把他设成1e9+7等等数字,这样弄......