AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

最大公约数

作者: 作者的头像   不知名的fE ,  2025-06-13 10:25:12 · 河北 ,  所有人可见 ,  阅读 4


0


最大公约数

import java.util.Scanner;

public class Main {
    static final int N = 100010, INF = 0x3f3f3f3f;
    static Node[] tr = new Node[N * 4];
    static int[] a = new int[N];
    static int n;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
            if (a[i] == 1) cnt++;
        }

        if (cnt != 0) {
            System.out.println(n - cnt);
            return;
        }

        build(1, 1, n);
        if (query(1, 1, n, 1, n) != 1) {
            System.out.println(-1);
            return;
        }

        int ans = INF;
        for (int i = 1; i <= n; i++) {
            int l = i, r = n;
            while (l < r) {
                int mid = l + r >> 1;
                if (query(1, 1, n, i, mid) == 1) r = mid;
                else l = mid + 1;
            }

            if (query(1, 1, n, i, r) == 1) ans = Math.min(ans, n - 1 + r - i);
        }

        System.out.println(ans);
    }

    static int query(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return tr[u].d;

        int mid = l + r >> 1;
        if (qr <= mid) return query(u * 2, l, mid, ql, qr);
        else if (ql > mid) return query(u * 2 + 1, mid + 1, r, ql, qr);
        else return gcd(query(u * 2, l, mid, ql, qr), query(u * 2 + 1, mid + 1, r, ql, qr));
    }

    static void build(int u, int l, int r) {
        tr[u] = new Node();
        if (l == r) {
            tr[u].d = a[l];
            return;
        }

        int mid = l + r >> 1;
        build(u * 2, l, mid);
        build(u * 2 + 1, mid + 1, r);
        pushup(u);
    }

    static void pushup(int u) {
        tr[u].d = gcd(tr[u * 2].d, tr[u * 2 + 1].d);
    }

    static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }

    static class Node {
        int d;
    }
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息