Cod sursa(job #337471)

Utilizator rumburakrumburak rumburak Data 3 august 2009 19:10:15
Problema Divk Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<cstdio>

using namespace std;

const int K = (1<<17);
const int N = (1<<9);

int* v[K];
int n,k,a,b,nr[K];

void citire()
{
	int i,x,s[N];
	char sir[10],*p;
	scanf("%d%d%d%d\n",&n,&k,&a,&b);
	s[0]=0;
	++nr[0];
	for(i=1;i<=n;++i)
	{
		fgets(sir,10,stdin);
		for(x=0,p=sir;*p && *p!='\n';++p)
			x=x*10+*p-'0';
		s[i]=(s[i-1]+x)%k;
		++nr[s[i]];
	}
	for(i=0;i<k;++i)
	{
		v[i]=new int[1+nr[i]];
		v[i][0]=0;
	}
	for(i=0;i<=n;++i)
		v[s[i]][++v[s[i]][0]] = i;
}

void calcul()
{
	long long rez=0;
	int i,j,pa,pb;
	for(i=0;i<k;++i)
	{
		pa=pb=1;
		n=v[i][0];
		for(j=1;j!=n+1;++j)
		{
			while(pa!=n+1 && v[i][pa]-v[i][j]<a)
				++pa;
			while(pb!=n+1 && v[i][pb]-v[i][j]<=b)
				++pb;
			rez+=pb-pa;
		}
	}
	printf("%lld\n",rez);
}

int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	citire();
	calcul();
	return 0;
}