1 条题解

  • 0
    @ 2026-10-18 18:41:54

    G7006 [GESP202406 七级] 区间乘积 题解

    知识点:前缀异或、质因数、状态压缩。

    解题思路

    用10位掩码记录2到29这10个素数的指数奇偶性,边读数边异或前缀状态;遇到与历史相同的状态,就增加其出现次数。

    为什么正确

    区间乘积为平方当且仅当每个质因子指数均为偶数,也就是两个前缀奇偶掩码相同。

    易错点

    素数表利用题目a_i范围,不可直接用于含更大质因子的扩展输入;空前缀状态0要先计一次。

    复杂度

    时间O(n log A),空间O(2^10)。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        cin>>n;
        int primes[]= {
            2,3,5,7,11,13,17,19,23,29
        }
        ;
        vector<long long>cnt(1024);
        cnt[0]=1;
        int mask=0;
        long long ans=0;
        while(n--) {
            int x;
            cin>>x;
            for(int j=0;j<10;j++)while(x%primes[j]==0) {
                x/=primes[j];
                mask^=1<<j;
            }
            ans+=cnt[mask]++;
        }
        cout<<ans;
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用16个自行生成的测试点。

    • 1

    信息

    ID
    782
    时间
    1000ms
    内存
    500MiB
    难度
    普及
    标签
    递交数
    0
    已通过
    0
    上传者