Pagini recente » Cod sursa (job #1082729) | Cod sursa (job #2062270) | Cod sursa (job #1402200) | Cod sursa (job #2977418) | Cod sursa (job #494965)
Cod sursa(job #494965)
#include <cstdio>
const int N = 500001;
int v[N],sum[N];
int n,k,a,b;
int nr[N];//nr[i] -> de cate ori apare i in secv curenta in vectorul sum
void citire()
{
scanf("%i%i%i%i",&n,&k,&a,&b);
for (int i = 1; i <= n; ++i)
scanf("%i",&v[i]);
}
void calculare_sume_partiale_mod_k()
{
for (int i = 1; i <= n; ++i)
sum[i] = (sum[i-1] + v[i])%k;
}
void rezolvare()
{
int pc;
long long rez = 0;
nr[0] = 1;
for (pc = a; pc <= b-1; ++pc)//aici consideram intervalul de la 0 la pc-A
{
//cuplam cu o val intre 0 si pc-A, obtinand sirul de la val+1 la pc
rez += nr[sum[pc]]; //nr de numere egale cu sum[pc], numarul care-l verificam acum, este bun.
++nr[ sum[pc-a+1] ];
}
for (; pc <= n; ++pc)//aici consideram intervalul de la pc-B la pc-A
{
rez += nr[sum[pc]];
++nr[ sum[pc-a+1] ];
--nr[ sum[pc-b] ];
}
printf("%lli",rez);
}
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
citire();
calculare_sume_partiale_mod_k();
rezolvare();
return 0;
}