Cod sursa(job #170748)

Utilizator razvi9Jurca Razvan razvi9 Data 3 aprilie 2008 09:53:47
Problema Divk Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<cstdio>
int n,a[500001],k,x,y,i,j,l,nr[100001];
long long s[500001];
typedef struct nod{int i;nod* u;}nod;
nod *r[100001],*u[100001],*t;
char str[20],*ps;
long long sol(int x)
{
	long long num=0;
	if(x==0) return 0;
	for(i=0;i<k;i++){
		u[i]=r[i];
		nr[i]=0;}
	for(i=1;i<=n;i++){
		j=s[i]%k;
		l=i-x;
		while(u[j]->i<l){
			u[j]=u[j]->u;
			nr[j]--;}
		num+=nr[j];
		nr[j]++;
	}
	return num;
}
int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	scanf("%d %d %d %d ",&n,&k,&x,&y);
	for(i=1;i<=n;i++){
		gets(str);
		ps=str;
		j=0;
		while(*ps>='0' && *ps<='9'){
			j=j*10+*ps-'0';
			ps++;}
		a[i]=j;
		s[i]=s[i-1]+a[i];
		j=s[i]%k;
		if(!r[j]){
			t=new nod;
			r[j]=t;
			u[j]=t;}
		else{
			t=new nod;
			u[j]->u=t;
			u[j]=t;}
		u[j]->u=0;
		u[j]->i=i;}
	printf("%lld",sol(y)-sol(x-1));
	fclose(stdout);
	return 0;
}