Pagini recente » Cod sursa (job #1918506) | Cod sursa (job #1576321) | Cod sursa (job #78150) | Cod sursa (job #3205630) | Cod sursa (job #1713146)
#include <cstdio>
#include <algorithm>
#define NMax 500005
using namespace std;
struct abc{
int rest;
int lg;
};
abc a[NMax];
long long sum[NMax];
long long v[NMax];
int x[NMax];
bool cmp( const abc A, const abc B )
{
if( A.rest == B.rest )
return A.lg < B.lg;
A.rest < B.rest;
}
int main(){
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
int f,mid,st,dr,i,j,ii,A,B,n,k,t;
long long ans=0;
scanf("%d %d %d %d",&n,&k,&A,&B);
for( i = 1; i <= n; ++i ) scanf("%lld",&v[i]);
for( i = 1; i <= n; ++i )
sum[i] = sum[i-1] + v[i];
for( i = 1; i <= n; ++i )
{
a[i].lg = i;
a[i].rest = sum[i] % k;
}
sort( a + 1, a + n + 1, cmp );
for( i = 1; i < n; )
{
for( j = i + 1; j <= n && a[i].rest == a[j].rest ; ++j );
if(j > i + 1)
{
for( t = 1, ii = i; ii < j; ++ii, ++t ) x[t] = a[ii].lg;
for( ii = 1; ii < t; ++ii )
{
for( st = ii + 1, dr = t; st <= dr; )
{
mid = ( st + dr) /2;
if( x[mid] - x[ii] < A ) st = mid + 1;
else if( x[mid] - x[ii] > B) dr = mid - 1;
else { f = mid; st = mid + 1; }
}
ans += f - ii;
}
}
i = j;
}
printf("%lld\n",ans);
return 0;
}