Cod sursa(job #2049987)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 27 octombrie 2017 21:32:08
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;
class Reader {
public:
    Reader() {}
    Reader(const char *file_name) {
        input_file.open(file_name,std::ios::in | std::ios::binary);
        input_file.sync_with_stdio(false);
        index&=0;
        input_file.read(buffer,SIZE); }
    inline Reader &operator >>(int &n) {
        for (; buffer[index]<'0' or buffer[index]>'9'; inc());
        n&=0;
        sign&=0;
        sign|=(buffer[index-1]=='-');
        for (; '0'<=buffer[index] and buffer[index]<='9'; inc())
            n=(n<<1)+(n<<3)+buffer[index]-'0';
        n^=((n^-n)&-sign);
        return *this; }
    ~Reader() {
        input_file.close(); }
private:
    std::fstream input_file;
    static const int SIZE=1<<17;
    char buffer[SIZE];
    int index,sign;
    inline void inc() {
        if(++index==SIZE)
            index=0,input_file.read(buffer,SIZE); } };

Reader f("divk.in");
ofstream g("divk.out");

int N, K, A, B;
int SumRem[500001];
int Count[500001];
long long Ans = 0;

int main() {
    f >> N >> K >> A >> B;
    for (int i = 1; i <= N; i++) {
        f >> SumRem[i];
        SumRem[i] += SumRem[i - 1];
        SumRem[i] %= K;

        if (A <= i) {
            Count[SumRem[i - A]]++;

            if (B < i)
                Count[SumRem[i - B - 1]]--; }

        Ans += Count[SumRem[i]]; }
    g << Ans; }