Pagini recente » Cod sursa (job #2698030) | Cod sursa (job #1707500) | Cod sursa (job #812018) | Cod sursa (job #2376593) | Cod sursa (job #3148683)
#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;
positions[0].push_back(0);
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
prefix_rest = (prefix_rest + x) % k;
int left_bound = i - b;
int right_bound = i - a;
int pos_left = CautBinLeft(positions[prefix_rest], left_bound);
int pos_right = CautBinRight(positions[prefix_rest], right_bound);
// cout << prefix_rest << '\n' << left_bound << ' ' << right_bound << '\n' << pos_left << ' ' << pos_right << '\n' << '\n';
if(pos_right != -1 && pos_left != -1)
answer += pos_right - pos_left + 1;
positions[prefix_rest].push_back(i);
}
cout << answer;
return 0;
}