Cod sursa(job #741980)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 27 aprilie 2012 18:51:36
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

#define NMAX 500001

const char infile[] = "divk.in";
const char outfile[] = "divk.out";

struct ProblemInput
{
	int elementCount;
	int* available;
	int* elements;
	int divisor;
	int minLength;
	int maxLength;

	ProblemInput()
	{
		elements = NULL;
		available = NULL;
	}

	~ProblemInput()
	{
		if(available != NULL)
		{
			delete available;
		}
		if(elements != NULL)
			delete elements;
	}
};



void readInput(ProblemInput& input, istream & fin)
{

	fin >> input.elementCount
		>> input.divisor
		>> input.minLength
		>> input.maxLength;

	input.available = new int[input.divisor];
	input.elements = new int[input.elementCount + 2];
	memset(input.available, 0, sizeof(int) * input.divisor);
	int currentNumber = 0;
	int currentSum = 0;
	input.elements[0] = currentSum;

	for(int i = 1 ; i <= input.elementCount; i++)
	{
		fin >> currentNumber;

		currentSum += currentNumber;
		currentSum %= input.divisor;
		input.elements[i] = currentSum;

	}
}


void solve(ProblemInput& input, ostream& fout)
{
	int* sum = input.elements;
	int* available = input.available;
	long long answer = 0;

	for(int i = input.minLength; i <= input.elementCount; i++)
	{
		
		available[sum[i - input.minLength]] ++;

		if(i > input.maxLength)
		{
			available[sum[i - input.maxLength - 1]]--;
		}
		
		answer += available[sum[i]];

	}

	fout << answer << "\n";
}

int main(int argc, char* argv[])
{

	ProblemInput input;
	fstream fin(infile, ios::in);
	readInput(input, fin);
	fin.close();

	fstream fout(outfile, ios::out);
	solve(input, fout);
	fout.close();
}