Pagini recente » Cod sursa (job #1389501) | Cod sursa (job #765329) | Cod sursa (job #494341)
Cod sursa(job #494341)
#include<vector>
#include<cstdio>
using namespace std;
const int K=1<<17;
vector<int> x[K];
int n,k,a,b,s,i,j,t;
long long rez,rez1,rez2;
int m,v[1<<18];
int cautbin1(int t)
{
int i, pas=1<<18;
for(i=0; pas; pas>>=1)
if(i+pas<=m && v[i+pas]<t)
i+=pas;
return 1+i;
}
int cautbin2(int t)
{
int i, pas=1<<18;
for(i=0; pas; pas>>=1)
if(i+pas<=m && v[i+pas]<=t)
i+=pas;
return i;
}
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
scanf("%d%d%d%d", &n , &k , &a , &b );
x[0].push_back(0);
for (i=1;i<=n;i++)
{
scanf("%d", & t);
s=(s+t)%k;
x[s].push_back(i);
}
for (i=0;i<k;i++)
{
for(j=0; j<x[i].size();++j)
v[j+1] = x[i][j];
m = x[i].size();
for ( j=0;j<x[i].size();j++)
{
rez1=cautbin1(x[i][j]-b);
rez2=cautbin2(x[i][j]-a);
//printf("%d %d\n", rez1 , rez2);
rez+= ( rez2-rez1+1);
}
}
printf("%lld\n",rez);
return 0;
}