Cod sursa(job #250877)

Utilizator alexeiIacob Radu alexei Data 1 februarie 2009 01:41:40
Problema Divk Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define NMAX 500010
#define KMAX 100010
int S[NMAX];
int N,K,A,B;

vector< int >R[KMAX];

void reading()
{
	scanf("%d%d%d%d\n",&N,&K,&A,&B);
	
	int i,a1;
	for(i=1; i<=N; ++i)
	{
		scanf("%d",&a1);
		S[i]=S[i-1]+a1;
		R[ S[i]%K ].push_back(i);
	}

}

long long solve(const int val)
{
	long long ANS=0;

	int i,j,bk=0,aux;

	if( R[0][0] <=val )
		++ANS;

	for(i=1; i<R[0].size(); ++i)
	{
		if( R[0][i]<=val )
			++ANS;
		while( R[0][i]-R[0][bk]>val )
			++bk;
		//printf("bk %d ( %d ) i %d ( %d ) val %d\n",bk,R[0][bk],i,R[0][i],val);

		if( R[0][i]-R[0][bk]>=1 )
			ANS+=i-bk;//printf("gains %d\n",i-bk);
	}

	for(j=1; j<K; ++j)
	{
		bk=0;
		for(i=1; i<R[j].size(); ++i)
		{
			while( R[j][i]-R[j][bk]>val )
				++bk;
		//printf("bk %d ( %d ) i %d ( %d ) val %d\n",bk,R[j][bk],i,R[j][i],val);

			if( R[j][i]-R[j][bk]>=1 )
				ANS+=i-bk;//printf("gains %d\n",i-bk);
		}
	}
	
	return ANS;
}

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

	reading();

	long long ANS1=solve(B);	
	long long ANS2=solve(A-1);
	
	//printf("%lld %lld\n",ANS1,ANS2);
	printf("%lld\n",ANS1-ANS2);

	return 0;
}