Cod sursa(job #494331)

Utilizator adrian_manducadrian manduc adrian_manduc Data 21 octombrie 2010 11:51:27
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 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 cautbin1(int t, int lin)
{
	int i, pas=1<<17;
	if(x[lin][0]>=t)
		return 0;
	for(i=0; pas; pas>>=1)
		if(i+pas<=x[lin].size() && x[lin][i+pas]<t)
			i+=pas;
	return 1+i;
}
int cautbin2(int t, int lin)
{
	int i, pas=1<<17;
	for(i=0; pas; pas>>=1)
		if(i+pas<=x[lin].size() && x[lin][i+pas]<=t)
			i+=pas;
	return i;
}	

int p,n,s=0,k,a,b,i,j;
int main()
{
	int p1,p2,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)
		{
			if(x[i][j]-b < 0)
				p1 = 1;
			else
				p1 = cautbin1(x[i][j] - b,i);
			p2 = cautbin2(x[i][j] - a,i);
			//g<<"i = "<<i<<" caut "<<x[i][j]<<" si obtin "<<p1<<" "<<p2<<"\n";
			rez += p2 - p1 + 1;
		}
	g<<rez;
	return 0;
}