Cod sursa(job #494342)

Utilizator pirvupirvu tudor pirvu Data 21 octombrie 2010 12:10:31
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream f("divk.in");
ofstream g("divk.out");
const int K=1<<17;
vector<int> x[K];
int m,v[1<<19];
int cautbin1(int t)
{
	int i, pas=1<<18;
	for(i=0; pas; pas>>=1)
		if(i+pas<=m && v[i+pas]<t)
			i+=pas;
	return 1+i;
}
int cautbin2(int t)
{
	int i, pas=1<<18;
	for(i=0; pas; pas>>=1)
		if(i+pas<=m && v[i+pas]<=t)
			i+=pas;
	return i;
}	

int p,n,s=0,k,a,b,i,j;
int main()
{
	int p1,p2;
	long long rez=0;
	f>>n>>k>>a>>b;
	x[0].push_back(0);
	//x[0][0]=0;
	for(i=1;i<=n;++i)
	{
		f>>p;
		s=(s+p)%k;
		x[s].push_back(i);
	}
	for(i=0; i<k;++i)
	{
		for(j=0; j<x[i].size();++j)
			v[j+1] = x[i][j];
		m = x[i].size();
		for(j=0; j<x[i].size();++j)
		{
			/*
			if(x[i][j]-b < 0)
				p1 = 1;
			else
				p1 = cautbin1(x[i][j] - b,i);
			*/
			p1 = cautbin1(x[i][j] - b);
			p2 = cautbin2(x[i][j] - a);
			//g<<"i = "<<i<<" caut "<<x[i][j]<<" si obtin "<<p1<<" "<<p2<<"\n";
			rez += p2 - p1 + 1;
		}
	}
	g<<rez;
	return 0;
}