1 条题解

  • 0
    @ 2025-10-22 22:10:57

    题目解析

    题意概括

    nn 张卡牌,每张卡牌有两个战斗力值 aia_ibib_i。对于每张卡牌,可以选择 aia_ibib_i 作为它的最终战斗力。目标是选择一种方案,使得所有卡牌最终战斗力的 最大公约数 (GCD) 尽可能大,并输出这个最大的 GCD。


    算法思路

    核心思想

    如果我们固定一个候选答案 gg,那么要求每张卡牌至少有一个战斗力值能被 gg 整除。
    也就是说,对于第 ii 张卡牌,必须满足: [ g \mid a_i \quad \text{或} \quad g \mid b_i ]

    反过来,如果我们想判断 gg 是否可能成为最终答案,只需要检查所有卡牌是否都满足上述条件。


    优化思路

    直接枚举所有可能的 gg 并检查每张卡牌会超时(nn 最多 10610^6aia_i 最多 5×1055 \times 10^5)。

    关键优化

    • 我们只关心 gg 的候选值,它必须是某个 aia_ibib_i 的因数。
    • bib_i 可能很大(最大 26312^{63}-1),不能直接枚举所有因数。
    • 观察:如果 gg 是最终答案,那么对于所有卡牌,gg 必须整除 aia_ibib_i
    • 我们可以反过来考虑:对于每个可能的 gg(从大到小枚举),判断它是否满足条件。

    算法步骤

    1. 预处理
      对于每个 aia_i,我们维护它与对应 bib_i 的 GCD,存入数组 a[x] 中。
      这里 a[x] 表示所有 ai=xa_i = x 的卡牌中,bib_i 的 GCD。
      同时计算所有 bib_i 的 GCD 作为初始答案 res

    2. 构建 GCD ST 表
      a[1..maxx] 建立 ST 表,用于快速查询区间 GCD。

    3. 从大到小枚举候选答案
      maxxres+1 倒序枚举 ii,检查 ii 是否可能是最终答案。
      检查方法:

      • 将区间 [1,maxx][1, maxx] 按长度 ii 分段。
      • 对每一段 [(j1)i+1,ji1][(j-1)\cdot i+1, j\cdot i - 1] 用 ST 表求 GCD。
      • 如果所有段的 GCD 都能被 ii 整除,则 ii 是可行解,输出并结束。
    4. 输出结果
      如果没找到更大的,就输出 res


    算法标签

    • 数论(GCD 性质)
    • ST 表(区间 GCD 查询)
    • 枚举优化(按倍数分段检查)

    复杂度分析

    • 预处理O(n+maxai)O(n + \max a_i)
    • ST 表构建O(maxailogmaxai)O(\max a_i \log \max a_i)
    • 枚举检查
      对于每个候选 ii,检查次数是 O(maxaii)O(\frac{\max a_i}{i}),总复杂度近似 O(maxailogmaxai)O(\max a_i \log \max a_i)

    总复杂度:O(n+maxailogmaxai)O(n + \max a_i \log \max a_i),在给定数据范围内可行。


    代码关键点说明

    // 核心检查逻辑
    for (int i = maxx; i > res; i--) {
        ll ans = query(maxx / i * i + 1, maxx); // 最后一段
        for (int j = 1; j <= maxx / i && (ans % i == 0); j++)
            ans = gcd(ans, query((j - 1) * i + 1, j * i - 1));
        if (ans % i == 0) {
            cout << i;
            return 0;
        }
    }
    

    这里 query(l, r) 返回区间 [l,r][l, r] 的 GCD。
    我们按长度 ii 分段,如果所有段的 GCD 都能被 ii 整除,说明 ii 是可行解。


    总结

    这道题的关键在于:

    1. 利用 GCD 的区间可合并性,用 ST 表快速查询。
    2. 通过分段检查,避免对每个候选 gg 都扫描所有卡牌。
    3. 从大到小枚举,一旦找到可行解立即输出。

    这样既保证了正确性,又保证了高效性。

    • 1

    「POI 2020/2021 R3」Kolekcjoner Bajtemonów 2

    信息

    ID
    3844
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者