Pagini recente » Cod sursa (job #103968) | Cod sursa (job #2450821) | Cod sursa (job #1514368) | Cod sursa (job #1107513) | Cod sursa (job #1731186)
#include <iostream>
#include <fstream>
using namespace std;
long long n,k,a,b,s[500001],i,x,f[500001],f1[500001],ct,v[500001];
int caut (int i, int j, int x)
{
if(i>j)
{
return i;
}
else
{
int m=(i+j)/2;
if(v[m]-x<=b)caut(m+1,j,x);
else caut(i,m-1,x);
}
}
int caut1 (int i, int j, int x)
{
if(i>j)
{
return i;
}
else
{
int m=(i+j)/2;
if(v[m]-x<a)caut1(m+1,i,x);
else caut1(i,m-1,x);
}
}
int calcul (int k)
{
int i;
for(i=1;i<=k;i++)
{
int t=caut(i+1,k,v[i]);
t-=(v[t]-v[i]>b || t>k);
int t1=caut1(i+1,k,v[i]);
t1+=(v[t1]-v[i]<a || t>k);
if(t>0 && t1>0 && t<=k && t1<=k && v[t1]-v[i]>=a && v[t]-v[i]<=b)
ct=ct+(t-t1+1);
}
}
int sswap(int k)
{
int i;
for(i=1;i<=k/2;i++)
swap(v[i],v[k-i+1]);
}
int main()
{
ifstream fin ("divk.in");
ofstream fout ("divk.out");
fin>>n>>k>>a>>b;
for(i=1;i<=n;i++)
{
fin>>x;
s[i]=s[i-1]+x;
s[i]%=k;
if(!f[s[i]]){f1[i]=i,f[s[i]]=i;}
else
{
f1[i]=f[s[i]];
f[s[i]]=i;
}if(!s[i] && i>=a && i<=b)ct++;
}
for(i=n;i>=1;i--)
if(f1[i])
{
int j,k1=0;
j=i;
while(j!=f1[j])
{
v[++k1]=j;
int t=j;
j=f1[j];
f1[t]=0;
// f1[t]=0;
}
v[++k1]=j;
f1[j]=0;
sswap(k1);
calcul(k1);
}
fout<<ct;
return 0;
}