Cod sursa(job #494341)

Utilizator pirvupirvu tudor pirvu Data 21 octombrie 2010 12:09:37
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<vector>
#include<cstdio>

using namespace std;

const int K=1<<17;

vector<int> x[K];

int n,k,a,b,s,i,j,t;

long long rez,rez1,rez2;

int m,v[1<<18];


int cautbin1(int t)
{
	int i, pas=1<<18;
	for(i=0; pas; pas>>=1)
		if(i+pas<=m && v[i+pas]<t)
			i+=pas;
	return 1+i;
}
int cautbin2(int t)
{
	int i, pas=1<<18;
	for(i=0; pas; pas>>=1)
		if(i+pas<=m && v[i+pas]<=t)
			i+=pas;
	return i;
}	



int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	
	scanf("%d%d%d%d", &n , &k , &a , &b );
	
	x[0].push_back(0);
	
	for (i=1;i<=n;i++)
	{
		scanf("%d", & t);
		s=(s+t)%k;
		x[s].push_back(i);
	}
	
	for (i=0;i<k;i++)
	{
		for(j=0; j<x[i].size();++j)
			v[j+1] = x[i][j];
		m = x[i].size();

		for ( j=0;j<x[i].size();j++)
		{
			rez1=cautbin1(x[i][j]-b);
			rez2=cautbin2(x[i][j]-a);
			//printf("%d %d\n", rez1 , rez2);
			rez+= ( rez2-rez1+1);
			
		}
	}
		
	printf("%lld\n",rez);
	
	
	return 0;
}