Cod sursa(job #329010)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 4 iulie 2009 13:16:31
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#include<string>
#include<iostream>

using namespace std;

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

#define nm 500005
#define maxbuf 65536

int s[nm],resturi[100005],r[nm],n,k,a,b;
int ind;
char buf[maxbuf];

inline void refbuf()
{
  int ans=fread(buf,1,maxbuf,fin);
  if(ans<maxbuf) buf[ans]=0;
  ind=0;
}

inline int getnr()
{
       int ans=0;
       one:
           while(ind<maxbuf&&!isdigit(buf[ind])) ind++;
           if(ind==maxbuf)
           {
             refbuf();
             goto one;
           }
       two:
           while(ind<maxbuf&&isdigit(buf[ind]))
           {
             ans=ans*10+buf[ind]-'0';
             ind++;
           }    
           if(ind==maxbuf)
           {
             refbuf();
             goto two;
           }
       
}

int main()
{
    int i,stop,start;
    long long ans=0;
    
    refbuf();
    
    n=getnr();
    k=getnr();
    a=getnr();
    b=getnr();
    
    for(i=1;i<=n;i++)
      s[i]=getnr();          
    
    //solve
    
    start=-1;stop=-1;
    r[0]=0;
    
    
    for(i=1;i<=n;i++)
    {
           
      r[i]=(r[i-1]+s[i])%k;
      
      //bagari
      
      while(i-stop>a)
      {                     
        stop++;
        resturi[r[stop]]++;
      }
      
      //scoateri  
      
      if(i-start>b)
        if(start>=0)   
        {
          resturi[r[start]]--;
          start++;
        }
        else start++; 
      ans+=resturi[r[i]];
    }
    
    fprintf(fout,"%lld",ans);
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}