Cod sursa(job #972573)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 12 iulie 2013 10:31:33
Problema Divk Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.73 kb
#include<fstream>
#include<deque>
using namespace std;
int n,K,A,B,v[500100],sum[500100],size[100100];
deque <int> D[100100];

inline long long Count(int L)
{
	int i,r;
	long long rez=0LL;
	D[0].push_back(0);
	size[0]=1;
	for(i=1;i<=n;i++)
	{
		r=sum[i];
		while(size[r] && i-D[r].front()>L)
		{
			D[r].pop_front();
			size[r]--;
		}
		rez+=1LL*size[r];
		D[r].push_back(i);
		size[r]++;
	}
	for(i=0;i<K;i++)
	{
		D[i].clear();
		size[i]=0;
	}
	return rez;
}

int main()
{
	int i;
	ifstream fin("divk.in");
	fin>>n>>K>>A>>B;
	for(i=1;i<=n;i++)
	{
		fin>>v[i];
		sum[i]=(sum[i-1]+v[i])%K;
	}
	fin.close();
	
	ofstream fout("divk.out");
	fout<<(Count(B)-Count(A-1))<<"\n";
	fout.close();
	return 0;
}