1 条题解

  • 0
    @ 2026-3-23 11:20:18

    如果区间里面有一个不是g的倍数,其他都是g的倍数,那么我一定可以让区间的gcd为g,直接需要改那个非倍数就好了;如果区间里面都是g的倍数,这个时候,只要我随便改一个数为g,那么gcd一定就是g

    这里我为了方便,把数组中可以整除g的映射为1,其余的为0,然后同向双指针,每次右边界扩大的时候,其实多的区间数就是原区间元素(因为原区间里每一个元素都可以和新元素组成一个区间),运用这个贡献法的思想就可以了

    不懂这里为什么这里可以计算贡献的,自己用样例演算一下即可

    #include <bits/stdc++.h>
    using namespace std;
    using ll= long long;
    const int N=1e5+10;
    int a[N];
    
    int main()
    {
        ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        int n,g;cin>>n>>g;
        for (int i=1;i<=n;++i)
        {
            ll res;cin>>res;
            if (res%g==0)
            a[i]=1;
            else a[i]=0;
        }
        int l=1,r=0,find0=0;
        ll ans=0;
        while(r<n)
        {
            if (a[r+1]==1)
            {
                ans+=r-l+1;
                ++r;
            }
            else if (a[r+1]==0 && find0==0)
            {
                ans+=r-l+1;
                ++r;
                find0=1;
            }
            else 
            {
                if (a[l]==0)
                find0=0;
                ++l;
            }
        }
        cout<<ans;
    }
    
    • 1

    信息

    ID
    433
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    50
    已通过
    15
    上传者