k倍区间

  • 题意:给定一个数组A[N],若子序列A[i] .... A[j]和为k的倍数,则[i,j]称为k倍区间,求k倍区间的数量。

  • 解析:区间和 \(\Rightarrow\) 前缀和。(s[r] - s[l - 1])% k == 0 \(\Rightarrow\) s[r] % k == s[l - 1] % k (同余),再利用cnt[N]计数即可。

    #include<iostream>
    using namespace std;
    using ll = long long;
    const int N = 1e5 + 10;
    
    int n,k,cnt[N];
    ll ans,s[N];
    
    int main()
    {
        cin>>n>>k;cnt[0]++;
        for(int i = 1; i <= n; ++i)cin>>s[i],s[i] += s[i - 1];
        for(int i = 1; i <= n; ++i)ans += cnt[s[i] % k],cnt[s[i] % k] ++;
        cout<<ans<<endl;
        return 0;
    }
    
posted @ 2021-06-30 14:44  Ivessas  阅读(105)  评论(0)    收藏  举报