Cod sursa(job #1135257)

Utilizator ELHoriaHoria Cretescu ELHoria Data 7 martie 2014 16:28:44
Problema Divk Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <iostream>
#include <vector>


using namespace std;

int brute(int& n,int& k,int& a,int& b,vector<int>& v) {
    int ret = 0;
    vector<int> sum(n + 1,0);
    for (int i = 1; i <= n; i++) {
        sum[i] = (sum[i - 1] + v[i - 1]) % k;
    }

    auto query = [&](const int& i,const int& j) {
        return sum[j] - sum[i - 1] < 0 ? sum[j] - sum[i - 1] + k : sum[j] - sum[i - 1];
    };

    
    for (int i = 1; i <= n; i++) {
        for (int j = i + a - 1;j <= n && j <= i + b - 1; j++) {
            ret += (query(i,j) == 0);
        }
    }
    
    return ret;
}



long long solve(int& n,int& k,int& a,int& b,vector<int>& v) {
    long long ret = 0;
    vector<int> sum(n + 1,0);
    vector<int> freq(k,0);
    for (int i = 1; i <= n; i++) {
        sum[i] = (sum[i - 1] + v[i - 1]) % k;
        if (i - a  > 0) {
            freq[sum[i - a + 1]]++;
        }

        if (i - b  > 0) {
            freq[sum[i - b]]--;
        }

     //   cout << i - (i - a) << " " << i - (i - b) << "\n";
        ret += freq[sum[i]];
    }

    return ret;
}


int main()
{
    ifstream cin("divk.in");
    ofstream cout("divk.out");
    int N, K, A, B;
    cin >> N >> K >> A >> B;
    vector<int> v(N);
    
    for (int i = 0; i < N; i++) {
        cin >> v[i];
    }

    
    cout <<  solve(N, K, A, B, v) << "\n";

    return 0;
}