Cod sursa(job #1536502)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 26 noiembrie 2015 11:41:48
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
using namespace std;

#define N 500001
#define K 100001

//ifstream in("divk.in");ofstream out("divk.out");

FILE *in = fopen("divk.in","r");
FILE *out = fopen("divk.out","w");

long long fcv_a[K], fcv_b[K];
int v[N], s[N];
int n,k,a,b;
long long sol_a, sol_b;

/*void afis()
{
    int i;
    for(i=0; i<k; ++i) cout<<fcv_a[i]<<" ";
    cout<<"   "<<sol_a;
    cout<<"\n";
    for(i=0; i<k; ++i) cout<<fcv_b[i]<<" ";
    cout<<"   "<<sol_b;
    cout<<"\n";
    cout<<"\n";
}*/

int main()
{
    int i,s1,s2,x;

    ///in>>n>>k>>a>>b; for(i=1; i<=n; ++i) in>>v[i];

    fscanf(in, "%d %d %d %d", &n, &k, &a, &b);
    for(i=1; i<=n; ++i) fscanf(in, "%d", &v[i]);

    for(i=1; i<=n; ++i) s[i] = (s[i-1] + v[i]) % k;

    ///for(i=0; i<=n; ++i) cout<<s[i]<<" "; cout<<"\n\n";

    --a; /// !!! Se iau solutiile de lungime b, din care se scad solutiile de lungime (a-1)

    fcv_a[0] = 1;
    fcv_b[0] = 1;
    for(i=1; i<=n; ++i)
    {
        x = s[i];  /// ceea ce caut

        if(i > a)
        {
            s1 = s[i-a-1]; /// prev
            --fcv_a[s1];
        }
        if(i > b)
        {
            s2 = s[i-b-1]; /// prev
            --fcv_b[s2];
        }

        ++fcv_a[x];
        sol_a += fcv_a[x] - 1;

        ++fcv_b[x];
        sol_b += fcv_b[x] - 1;

        //afis();
    }

    /*cout<<"Sol 1: "<<sol_a<<"\n";
    cout<<"Sol 2: "<<sol_b<<"\n";

    cout<<"\n";
    cout<<sol_b - sol_a;
    cout<<"\n";*/

    fprintf(out,"%lld", (sol_b - sol_a));

    return 0;
}