Cod sursa(job #1193692)

Utilizator silvatheviprersilviu catioiu silvatheviprer Data 1 iunie 2014 15:29:05
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int N, K, A, B, v[1<<19], S[1<<19], re[1<<17];

long long rec( int len )
{
    memset( re, 0, sizeof( re ) );

    long long ret = 0;

    if( !len )
        return ret;

    re[0]++;



    for( int i = 1; i < len; i++ )
    {
        ret += (long long)(re[ S[i] ]),
               re[ S[i] ]++;


    }



    for( int i = len; i <= N; i++ )
    {
        ret += (long long)(re[ S[i] ]),
               re[ S[i] ]++,
               re[ S[i - len] ]--;
    }

    return ret;
}

int main()
{
    freopen("divk.in", "r", stdin);
    freopen("divk.out", "w", stdout);

    int i;

    scanf("%d %d %d %d", &N, &K, &A, &B);
    for(i = 1; i <= N; i++)
        scanf("%d", v+i ),
              S[i] = S[i-1] + v[i],
                     S[i] %= K;

    long long ret = rec( B ) - rec( A - 1 );

    cout << ret << endl;

    return 0;
}