Cod sursa(job #373008)

Utilizator FlorianFlorian Marcu Florian Data 12 decembrie 2009 13:53:29
Problema Divk Scor 100
Compilator cpp Status done
Runda Problemiada - Editia #6 Marime 1.13 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX_N 500002
#define DIM 8192
char vec[DIM];
int pz;
int S[MAX_N];
int N,K,a,b;
vector<int>A[MAX_N];

void cit(int &x)   
 {   
  x=0;   
  while(vec[pz]<'0' || vec[pz]>'9')   
  
    if(++pz==DIM) fread(vec,1,DIM,stdin),pz=0;   
  
    while(vec[pz]>='0' && vec[pz]<='9')   
    {   
        x=x*10+vec[pz]-'0';   
        if(++pz==DIM)fread(vec, 1, DIM, stdin),pz=0;   
    }   
 } 
long long unsigned q(int x, int i, int j)
{
	int p = (int)(lower_bound(A[x].begin(), A[x].end(), i) - A[x].begin());
	int k = (int)(upper_bound(A[x].begin(), A[x].end(), j) - A[x].begin()) - 1;
	if(p > k) return 0;
	return (long long unsigned)(k - p +1);
}
int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	cit(N), cit(K); cit(a), cit(b);
	int i,x,p;
	long long unsigned sol = 0;
	for(i = 1; i <= N; ++i)
	{
		cit(x);
		S[i] = (S[i-1] + x)%K;
		A[S[i]].push_back(i);
	}
	for(i = 1; i + a - 1 <= N; ++i)
	{
		p = min(N, i + b -1);
		sol += q(S[i-1], i + a - 1, p);
	}
	printf("%llu\n",sol);
	return 0;
}