Mai intai trebuie sa te autentifici.

Cod sursa(job #494964)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 23 octombrie 2010 15:05:35
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>

const int N = 500001;

int v[N],sum[N];
int n,k,a,b;
int nr[N];//nr[i] -> de cate ori apare i in secv curenta in vectorul sum

void citire()
{
	scanf("%i%i%i%i",&n,&k,&a,&b);
	for (int i = 1; i <= n; ++i)
		scanf("%i",&v[i]);
}

void calculare_sume_partiale_mod_k()
{
	for (int i = 1; i <= n; ++i)
		sum[i] = (sum[i-1] + v[i])%k;
}

void rezolvare()
{
	int pc;
	int rez = 0;
	nr[0] = 1;
	for (pc = a; pc <= b-1; ++pc)//aici consideram intervalul de la 0 la pc-A
	{
		//cuplam cu o val intre 0 si pc-A, obtinand sirul de la val+1 la pc
		rez += nr[sum[pc]]; //nr de numere egale cu sum[pc], numarul care-l verificam acum, este bun.
		++nr[ sum[pc-a+1] ];
	}
	
	for (; pc <= n; ++pc)//aici consideram intervalul de la pc-B la pc-A
	{
		rez += nr[sum[pc]];
		++nr[ sum[pc-a+1] ];
		--nr[ sum[pc-b] ];
	}
	printf("%i",rez);
}

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