Pagini recente » Cod sursa (job #1629962) | Cod sursa (job #3194383) | Cod sursa (job #1192686) | Cod sursa (job #866537) | Cod sursa (job #1144027)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("divk.in");
ofstream os("divk.out");
int n, k, lmin, lmax;
int a, s;
int ii, jj;
long long answ;
vector<int> r[100000];
void BSLEFT(int q, int rt, int sum);
void BSRIGHT(int q, int rt, int sum);
int main()
{
is >> n >> k >> lmin >> lmax;
for ( int i = 0; i < k; ++i )
r[i].push_back(0);
r[0][0] = 1;
r[0].push_back(0);
for ( int i = 1; i <= n; ++i )
{
is >> a;
s = ( s + a ) % k;
++r[s][0];
r[s].push_back(i);
/*for ( int j = 1; j <= r[s][0]; ++j )
if ( i - r[s][j] >= lmin && i - r[s][j] <= lmax )
++answ;*/
BSLEFT(max(i - lmax + 1, 0), r[s][0], s);
BSRIGHT(max(i - lmin + 1, 0), r[s][0], s);
answ += jj - ii + 1;
}
os << answ;
is.close();
os.close();
return 0;
}
void BSLEFT(int q, int rt, int sum)
{
int lt = 1, md;
while ( lt <= rt )
{
md = ( lt + rt ) / 2;
if ( r[sum][md] < q )
lt = md + 1;
else
{
rt = md - 1;
ii = md;
}
}
}
void BSRIGHT(int q, int rt, int sum)
{
int lt = 1, md;
while ( lt <= rt )
{
md = ( lt + rt ) / 2;
if ( r[sum][md] <= q )
{
lt = md + 1;
jj = md;
}
else
rt = md - 1;
}
}