Pagini recente » Cod sursa (job #2294124) | Cod sursa (job #72388) | Cod sursa (job #1920922) | Cod sursa (job #321545) | Cod sursa (job #2306750)
#include <bits/stdc++.h>
using namespace std;
int v[100005],dp[100005];
vector<int>rest[100005];
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
int n,k,a,b,i,nr;
scanf("%d%d%d%d",&n,&k,&a,&b);
for(i=1;i<=n;i++)
{
scanf("%d",&nr);
v[i]=v[i-1]+nr;
v[i]%=k;
rest[v[i]].push_back(i);
}
for(i=1;i<=n;i++)
{
int r1=v[i-1];
int st=0,dr=rest[r1].size()-1;
while(st<=dr)
{
int med=(st+dr)/2;
if(rest[r1][med]<=(i-1))st=med+1;
else
dr=med-1;
}
if(st==rest[r1].size())
dp[i]=n+1;
else
dp[i]=rest[r1][st];
}
int sol=0;
dp[n+1]=n+1;
for(i=1;i<=n;i++)
{
int j=i;
int poz=dp[i];
if(v[i]==v[i-1]){j++;
if(a==1)sol++;}
poz=dp[j];
while(poz<=n)
{
int dif=poz-i;
dif++;
if(dif<=b&&dif>=a)sol++;
poz=dp[poz+1];
if(dif>b)break;
}
}
printf("%d\n",sol);
return 0;
}