Pagini recente » Cod sursa (job #2362058) | Cod sursa (job #757766) | Cod sursa (job #1156938) | Cod sursa (job #2196468) | Cod sursa (job #1073548)
#include <iostream>
#include <fstream>
#include <vector>
#define maxLength 500010
using namespace std;
int n,k,a,b;
int 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);
}
}
int divK(int l)
{
int li,ls;
int 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 += (ls - li - 1 - discount[subset[i][li]]);
li++;
}
}
ls --;
if(ls - li > 0)
{
while(li < ls)
{
count += (ls - li - discount[subset[i][li]]);
li ++;
}
}
}
return count;
}
void solve()
{
output = divK(b) - divK(a-1);
}
void write()
{
out << output;
}
int main()
{
read();
solve();
write();
}