Pagini recente » Cod sursa (job #733238) | Cod sursa (job #1572171) | Cod sursa (job #970991) | Cod sursa (job #2502571) | Cod sursa (job #972578)
Cod sursa(job #972578)
#include<fstream>
#include<cstdlib>
#include<vector>
using namespace std;
int n,K,A,B,sum[500100],size[100100],ind[100100];
vector <int> poz[100100];
char *buffer;
inline void Citeste(int &x)
{
while(*buffer<'0' || '9'<*buffer)
buffer++;
x=0;
while('0'<=*buffer && *buffer<='9')
{
x=x*10+*buffer-'0';
buffer++;
}
}
inline long long Count(int L)
{
int i,r;
long long rez=0LL;
poz[0].push_back(0);
ind[0]=0;
size[0]=1;
for(i=1;i<=n;i++)
{
r=sum[i];
while(ind[r]<size[r] && i-poz[r][ind[r]]>L)
ind[r]++;
rez+=1LL*(size[r]-ind[r]);
poz[r].push_back(i);
size[r]++;
}
for(i=0;i<K;i++)
{
poz[i].clear();
size[i]=0;
ind[i]=0;
}
return rez;
}
int main()
{
int i,x;
ifstream fin("divk.in");
fin.seekg(0,ios::end);
int fs=fin.tellg();
fin.seekg(0,ios::beg);
buffer=(char *)malloc(fs);
fin.getline(buffer,fs,0);
fin.close();
Citeste(n); Citeste(K); Citeste(A); Citeste(B);
for(i=1;i<=n;i++)
{
Citeste(x);
x%=K;
sum[i]=sum[i-1]+x;
if(sum[i]>=K)
sum[i]-=K;
}
ofstream fout("divk.out");
fout<<(Count(B)-Count(A-1))<<"\n";
fout.close();
return 0;
}