Pagini recente » Cod sursa (job #215224) | Cod sursa (job #194816) | Cod sursa (job #1437344) | Cod sursa (job #1398897) | Cod sursa (job #87527)
Cod sursa(job #87527)
#include <cstdio>
#include <cstdlib>
#include <vector.h>
#define max 500000
typedef struct pnod
{
int poz;
pnod *next;
} pnod;
int a[max],n, aa,bb,k, s[max];
//pnod *v[100000];
vector <int> w[100000];
void citire()
{
freopen("divk.in", "r", stdin);
scanf("%d %d %d %d\n", &n, &k, &aa, &bb);
for (int i = 1; i<=n ; i++)
{
scanf("%d\n",&a[i]);
s[i] = s[i-1] + a[i];
}
w[0].push_back(0);
for (int i = 1; i <=n; i++)
w[ s[i] % k ].push_back(i);
fclose(stdin);
}
int calc(int lung)
{
int nr = 0;
for (int i = 0; i<k; i++)
{
int p1 = 0, p2 =0;
int c1=1, c2=0;
while ( p2 +1 < w[i].size() )
{
//muta dreapta
for (c2=0 ; p2<w[i].size() && w[i][p2] - w[i][p1] +1 <=lung; p2++)
c2++;
p2--; c2--;
nr+=c1 * c2 + c2 * (c2-1) / 2;
p1++; c1+=(c2-1);
if (p2 < p1 ) { p2 = p1; c1 = 1; };
}
}
return nr;
}
int main()
{
citire();
int rez,r1,r2;
r1=calc(bb);
//if (aa > 2)
r2=calc(aa-1);
//else r2=0;
rez = r1-r2;
freopen("divk.out","w", stdout);
printf("%d", rez);
fclose(stdout);
}