Cod sursa(job #1307113)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 1 ianuarie 2015 10:36:01
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
using namespace std;
 
#include <cstdio>
#include <cstring>
#include <iostream>
 
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]++;
     
//    cout << " first half : " << endl;
     
    for( int i = 1; i < len; i++ )
    {
         ret += (long long)(re[ S[i] ]),
         re[ S[i] ]++;
          
//         cout << i << " : incr by " << re[ S[i] ]-1 << endl;
//         if( S[i] == 0 )
//             ret++;
    }    
     
//    cout << " second half " << endl;
      
    for( int i = len; i <= N; i++ )
    {
         ret += (long long)(re[ S[i] ]),
         re[ S[i] ]++,
         re[ S[i - len] ]--;
          
//         cout << i << " : incr by " << re[ S[i] ]-1 << endl;
//         if( S[i] == 0 )
//            ret++;
    }
     
//    cout << len << " : " << ret << endl;
     
    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;   
}