Pagini recente » Cod sursa (job #298655) | Cod sursa (job #717467) | Cod sursa (job #1458754) | Cod sursa (job #1981288) | Cod sursa (job #131107)
Cod sursa(job #131107)
#include <stdio.h>
#define maxn 500010
#define maxk 100010
int p,q,p1,p2,i,j,n,k,a,b,m;
int v[maxn],g[maxn],s[maxn],ind[maxn];
int nr[maxk],vine[maxk];
int poz[maxk][2];
long long nrtot;
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
scanf("%d%d%d%d",&n,&k,&a,&b);
s[0]=0;
for (i=1; i<=n; i++)
{
scanf("%d",&g[i]);
ind[i]=0;
s[i]=(s[i-1]+g[i])%k;
nr[s[i]]++;
}
m=0;poz[0][1]=0;
for (i=0; i<=k-1; i++)
if (nr[i]!=0)
{
m++;
poz[m][0]=poz[m-1][1]+1;
poz[m][1]=poz[m][0]+nr[i]-1;
ind[m]=poz[m][0]-1;
vine[i]=m;
}
for (i=1; i<=n; i++)
{
ind[vine[s[i]]]++;
v[ind[vine[s[i]]]]=i;
}
nrtot=0;
for (i=1; i<=n; i++)
if (s[i]==0 && b>=i && i>=a) nrtot++;
//calcul NlogN
for (i=1; i<=m; i++)
for (j=poz[i][0]; j<=poz[i][1]; j++)
{
p1=-1;p=j-1;q=poz[i][1]+1;
while (p+1<q)
{
int r=(p+q)/2;
if (b>=v[r]-v[j] && v[r]-v[j]>=a)
{
p1=r;
q=r;
}
else if (b<v[r]-v[j]) q=r;
else if (a>v[r]-v[j]) p=r;
}
p=j-1;q=poz[i][1]+1;p2=p1-1;
while (p+1<q)
{
int r=(p+q)/2;
if (b>=v[r]-v[j] && v[r]-v[j]>=a)
{
p2=r;
p=r;
}
else if (b<v[r]-v[j]) q=r;
else if (a>v[r]-v[j]) p=r;
}
nrtot+=p2-p1+1;
}
printf("%lld\n",nrtot);
return 0;
}