Pagini recente » Cod sursa (job #854484) | Cod sursa (job #2431944) | Cod sursa (job #2956964) | Cod sursa (job #3042231) | Cod sursa (job #1073552)
#include <iostream>
#include <fstream>
#include <vector>
#define maxLength 500010
using namespace std;
int n,k,a,b;
long long output;
int input[maxLength];
int sumK[maxLength];
bool discount[maxLength];
vector< int > subset[maxLength];
ifstream in("divk.in");
ofstream out("divk.out");
void read()
{
in >> n >> k >> a >> b;
subset[0].push_back(0);
for(int i=1; i<=n; i++)
{
in>>input[i];
sumK[i] = (sumK[i-1] + input[i]) % k;
subset[sumK[i]].push_back(i);
}
}
long long divK(int l)
{
int li,ls;
long long count = 0;
for(int i = 0; i < n; i++)
{
li = 0;
for(ls = 0; ls < subset[i].size(); ls++)
{
if(ls < subset[i].size() - 1 )
{
if(subset[i][ls + 1] - subset[i][ls] == 1)
{
discount[ subset[i][ls] ] = true;
}
}
while(subset[i][ls] - subset[i][li] > l)
{
count = (long long) count + (ls - li - 1 - discount[subset[i][li]]);
li++;
}
}
ls --;
if(ls - li > 0)
{
while(li < ls)
{
count = (long long) count + (ls - li - discount[subset[i][li]]);
li ++;
}
}
}
return count;
}
void solve()
{
output = (long long) divK(b) - divK(a-1);
}
void write()
{
out << output;
}
int main()
{
read();
solve();
write();
}