Cod sursa(job #303942)

Utilizator ooctavTuchila Octavian ooctav Data 10 aprilie 2009 15:43:44
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
// divk.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
int n,k,a,b,d=0,st,dr;
int e[500001];
int s[500001];
int rest[100000];
int pozitii[100000];
int lista[500001];
long long t=0,nr;
int to[1000001];
void adunare()
{
	int trans=0,i=1;
	while(trans || t)
	{
		to[i]=(trans=trans+t%10+to[i])%10;
		t=t/10;
		trans=trans/10;
		i++;
	}
	while(to[to[0]+1]!=0)
		to[0]++;

}
int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	scanf("%d %d %d %d",&n,&k,&a,&b);
	int i,j;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&e[i]);
		s[i]=(s[i-1]+e[i])%k;
		rest[s[i]]++;
	}
	pozitii[0]=1;
	d=rest[0];
	for(i=1;i<=n;i++)
	{
		pozitii[i]=pozitii[i-1]+d;
		d=rest[i];
	}
	for(i=1;i<=n;i++)
		lista[++pozitii[s[i]]]=i;
	i=0;
	while(i<k)
	{
		t=0;
		if(i>0)
			st=pozitii[i-1]+1;
		else
			st=1;
		nr=1;
		for(j=st+1;j<=pozitii[i];j++)
		{
			nr++;
			while(lista[st]+b<lista[j])
			{
				st++;
				nr--;
			}
			t=t+nr-1;
		}
		if(i>0)
			st=pozitii[i-1]+1;
		else
			st=1;
		nr=1;
		for(j=st+1;j<=pozitii[i];j++)
		{
			nr++;
			while(lista[st]+a-1<lista[j])
			{
				st++;
				nr--;
			}
			t=t-(nr-1);
		}
		adunare();
		i++;
	}
	for(i=to[0];i>=1;i--)
		printf("%lld",to[i]);


	return 0;
}