zoukankan      html  css  js  c++  java
  • Codeforces Round #736 (Div. 2). D

    原题:D - Integers Have Friends

    题意:

    给定一个数组,求一个最长子数组满足(a_i \,\, mod \,\, m \,\, = \,\, a_{i + 1} \,\, mod \,\, m = ... \,\, = \,\, a_j \,\,mod\,\, m \,\,(m geq 2))
    求其最长长度。

    根据同余定理(a≡b\,(mod \,\,m))等价于(a - b)可以被(m)整除。那么还有(b[i] = a[i + 1] - a[i]),所以说如果一个子数组同余于(m),那么这个子数组的差分数组一定可以被(m)整除,那么就说明这个子数组有一个最大公约数(m),所以我们可用线段树或者(st)表来维护一下区间的(gcd),那么对于求一个区间最大长度用双指针维护即可。

    代码

     #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    
    const int N = 2E5 + 10, M = 20;
    LL a[N], b[N];
    int n;
    LL f[N][M];
    int l2g[N];
    
    void init() {
        for (int j = 0; j < M; j++) {
            for (int i = 1; i + (1 << j) - 1 <= n; i++) {
                if (!j) f[i][j] = b[i];
                else f[i][j] = __gcd(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
            }
        }
    }
    
    LL query(int l, int r) {
        int k = l2g[r - l + 1];
        return __gcd(f[l][k], f[r - (1 << k) + 1][k]);
    }
    
    int main() {
        int t; scanf("%d", &t);
        l2g[2] = 1;
        for (int i = 3; i <= N; i++) l2g[i] = l2g[i / 2] + 1;
        while (t--) {
            scanf("%d", &n);
            for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
            for (int i = 1; i <= n - 1; i++) b[i] = abs(a[i] - a[i + 1]);
            if (n == 1) {
                cout << 1 << endl;
                continue;
            }
    
            init();
            
            int res = 0;
            int j = 1;
            for (int i = 1; i <= n - 1; i++) {
                while (j <= i && query(j, i) == 1) j++;
                res = max(res, i - j + 2);
            }
    
            printf("%d
    ", res);
        }
    
        return 0;
    } 
    
  • 相关阅读:
    共享内存
    利用消息队列实现ECHO_SRV
    LINUX学习:System V消息队列
    linux:利用socketpair来在进程间传递描述符
    react传参
    ajax、axios、fetch
    js 深拷贝和浅拷贝实现
    css----px、rem、em、vw、vh、vm
    Sass、Less 和 Stylus区别
    箭头函数和普通函数对比
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/15097606.html
Copyright © 2011-2022 走看看