Pagini recente » Cod sursa (job #1918373) | Cod sursa (job #1338919) | Cod sursa (job #54800) | Cod sursa (job #798099) | Cod sursa (job #3148680)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("divk.in");
ofstream cout("divk.out");
const int KMAX = 1e5;
vector<int> positions[KMAX + 1];
int CautBinLeft(vector<int> &a, int value)
{
int st = 0, dr = a.size() - 1, pos = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(a[mij] >= value)
pos = mij, dr = mij - 1;
else
st = mij + 1;
}
return pos;
}
int CautBinRight(vector<int> &a, int value)
{
int st = 0, dr = a.size() - 1, pos = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(a[mij] <= value)
pos = mij, st = mij + 1;
else
dr = mij - 1;
}
return pos;
}
int main()
{
int n, k, a, b;
cin >> n >> k >> a >> b;
int prefix_rest = 0;
long long answer = 0;
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
prefix_rest = (prefix_rest + x) % k;
int left_bound = i - b + 1;
int right_bound = i - a + 1;
int pos_left = CautBinLeft(positions[prefix_rest], left_bound);
int pos_right = CautBinRight(positions[prefix_rest], right_bound);
if(pos_left != -1)
answer += pos_right - pos_left + 1;
positions[prefix_rest].push_back(i);
}
cout << answer;
return 0;
}