zoukankan      html  css  js  c++  java
  • [JSOI 2015] 最大公约数

    [题目链接]

             https://www.lydsy.com/JudgeOnline/problem.php?id=4488

    [算法]

           不妨首先枚举左端点

           注意到对于任意一个正整数n , 其质因子个数是log(n)级别的 , 故最大公约数最多降log(n)次

           用稀疏表维护区间gcd

           枚举左端点L , 二分求出每一段区间 , 更新答案即可

           时间复杂度 : O(NlogN ^ 2)

    [代码]

             

    #include<bits/stdc++.h>
    using namespace std;
    
    #ifndef LOCAL
            #define eprintf(...) fprintf(stderr, _VA_ARGS_)
    #else
            #define eprintf(...) 42
    #endif
    
    typedef long long ll;
    typedef pair<int , int> pii;
    typedef pair<ll , int> pli;
    typedef pair<ll , ll> pll;
    typedef long double ld;
    typedef unsigned long long ull;
    #define mp make_pair
    const int N = 1e5 + 10;
    const int MAXLOG = 20;
    
    #define rint register int
    
    int n;
    ll sp[N][MAXLOG] , a[N];
    int bit[N] , lg[N];
    ll ans;
    
    template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
    template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
    template <typename T> inline void read(T &x) {
        T f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
        for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
        x *= f;
    }
    inline ll gcd(ll x , ll y) {
            if (y == 0) return x;
            else return gcd(y , x % y);
    }
    inline ll query(int l , int r) {
            int k = lg[r - l + 1];
            return gcd(sp[l][k] , sp[r - (1 << k) + 1][k]);
    }
    
    int main() {
            
            read(n);
            for (rint i = 1; i <= n; ++i) read(sp[i][0]);
            for (rint i = 1; i <= n; ++i) lg[i] = (int)((double)log(i) / log(2.0));
            bit[0] = 1;
            for (rint i = 1; i < MAXLOG; ++i) bit[i] = bit[i - 1] << 1;
            for (rint i = 1; i < MAXLOG; ++i) {
                    for (rint j = 1; j + (1 << i) - 1 <= n; ++j) {
                            sp[j][i] = gcd(sp[j][i - 1] , sp[j + (1 << (i - 1))][i - 1]);
                    }
            }
            for (int i = 1; i <= n; ++i) {
                    int P = i;
                    while (P <= n) {
                            int nxt = P , l = P , r = n;
                            while (l <= r) {
                                    int mid = (l + r) >> 1;
                                    if (query(i , mid) == query(i , P)) {
                                            nxt = mid;
                                            l = mid + 1;
                                    } else r = mid - 1;
                            }
                            chkmax(ans , 1LL * query(i , nxt) * (nxt - i + 1));
                            P = nxt + 1;
                     }        
            }
            printf("%lld
    " , ans);
            
            return 0;
        
    }
  • 相关阅读:
    如何在intellj Idea中给新建的项目添加jar包?
    sell
    3D立体方块旋转图册
    npm run eject 命令后出现This git repository has untracked files or uncommitted changes错误
    video标签使用积累+背景视频+遇到问题(视频无法显示,不能自动播放,video自适应div,控件隐藏)
    webpack——react
    webpack——bable-loader,core,preset,编译es6
    webpack——打包JS
    简单的前端上传图片代码
    node——文件写入,文件读取
  • 原文地址:https://www.cnblogs.com/evenbao/p/10928074.html
Copyright © 2011-2022 走看看