Pagini recente » Cod sursa (job #165729) | Cod sursa (job #2023533) | Cod sursa (job #1650352) | Cod sursa (job #1243277) | Cod sursa (job #970714)
Cod sursa(job #970714)
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("divk.in");
ofstream g("divk.out");
struct Element{
int value;
int pozition;
};
int N,K,A,B,Arr[500002],Rest[500002],Place[100002],Last_elem[100002];
Element Partial[500002],Partial2[500002];
long long add;
void Read()
{
int i;
f>>N>>K>>A>>B;
for(i=1;i<=N;i++)
{
f>>Arr[i];
Partial[i].value=(Partial[i-1].value+Arr[i])%K;
Partial[i].value%=K;
Partial[i].pozition=i;
Rest[Partial[i].value]++;
if(i>=A && i<=B && Partial[i].value==0)
add++;
}
Place[0]=1;
for(i=1;i<K;i++)
Place[i]=Place[i-1]+Rest[i-1];
for(i=1;i<=N;i++)
{
Partial2[Place[Partial[i].value]].value=Partial[i].value;
Partial2[Place[Partial[i].value]++].pozition=Partial[i].pozition;
}
}
long long Solve_for_1_L(int L)
{
int i;
long long counter=0;
for(i=1;i<=N;i++)
{
bool ok=0;
if(Last_elem[Partial2[i].value]==0)
{
Last_elem[Partial2[i].value]=i;
continue;
}
else
{
for(int j=Last_elem[Partial2[i].value];j<i;j++)
if(Partial2[i].pozition-Partial2[j].pozition<=L)
{
counter+=(long long)i-j;
Last_elem[Partial2[i].value]=j;
ok=1;
break;
}
if(ok==0)
Last_elem[Partial2[i].value]=i;
}
}
return counter;
}
void Browse()
{
long long X,Y;
X=Solve_for_1_L(A-1);
memset(Last_elem,0,sizeof(Last_elem));
Y=Solve_for_1_L(B);
g<<Y-X+add<<"\n";
}
int main()
{
Read();
Browse();
return 0;
}