Cod sursa(job #1234251)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 26 septembrie 2014 22:39:42
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <cstdio>

using namespace std;
int spart[500005],frecv[100005];

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

    int N,K,A,B;
    scanf("%d%d%d%d",&N,&K,&A,&B);
    long long sol = 0;
    for(int i = 1; i <= N; ++i)
    {
        scanf("%d",&spart[i]);
        spart[i] = ( spart[i] + spart[i-1] ) % K;
        /// ma fixez pe secventa i-B-1, i-A astfel eu caut doar secvente de lungime
        ///intre A si B care se termina pe i
        if(i >= A)
            frecv[spart[i-A]] ++;
        if(i > B)
            frecv[spart[i-B-1]] --;
        /// adun numarul de aparitii a sumei %K din intervalul : [i-B-1,i-A]
        sol += frecv[spart[i]];
    }
    printf("%lld\n",sol);
    return 0;
}