Pagini recente » Cod sursa (job #317260) | Cod sursa (job #1472119) | Cod sursa (job #2877517) | Cod sursa (job #765174) | Cod sursa (job #250877)
Cod sursa(job #250877)
#include<stdio.h>
#include<vector>
using namespace std;
#define NMAX 500010
#define KMAX 100010
int S[NMAX];
int N,K,A,B;
vector< int >R[KMAX];
void reading()
{
scanf("%d%d%d%d\n",&N,&K,&A,&B);
int i,a1;
for(i=1; i<=N; ++i)
{
scanf("%d",&a1);
S[i]=S[i-1]+a1;
R[ S[i]%K ].push_back(i);
}
}
long long solve(const int val)
{
long long ANS=0;
int i,j,bk=0,aux;
if( R[0][0] <=val )
++ANS;
for(i=1; i<R[0].size(); ++i)
{
if( R[0][i]<=val )
++ANS;
while( R[0][i]-R[0][bk]>val )
++bk;
//printf("bk %d ( %d ) i %d ( %d ) val %d\n",bk,R[0][bk],i,R[0][i],val);
if( R[0][i]-R[0][bk]>=1 )
ANS+=i-bk;//printf("gains %d\n",i-bk);
}
for(j=1; j<K; ++j)
{
bk=0;
for(i=1; i<R[j].size(); ++i)
{
while( R[j][i]-R[j][bk]>val )
++bk;
//printf("bk %d ( %d ) i %d ( %d ) val %d\n",bk,R[j][bk],i,R[j][i],val);
if( R[j][i]-R[j][bk]>=1 )
ANS+=i-bk;//printf("gains %d\n",i-bk);
}
}
return ANS;
}
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
reading();
long long ANS1=solve(B);
long long ANS2=solve(A-1);
//printf("%lld %lld\n",ANS1,ANS2);
printf("%lld\n",ANS1-ANS2);
return 0;
}