Pagini recente » Cod sursa (job #1076619) | Cod sursa (job #1159147) | Cod sursa (job #2110288) | Cod sursa (job #2487884) | Cod sursa (job #1548161)
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 500005
using namespace std;
vector <vector <long long> > aux;
long long v[NMAX] , p[NMAX] , dp[NMAX];
long long n , k , a , b;
long long solve(long long nr);
int main() {
freopen("divk.in" , "r" , stdin);
freopen("divk.out" , "w" , stdout);
long long sum = 0;
scanf("%lld %lld %lld %lld" , &n , &k , &a , &b);//f >> n >> k >> a >> b;
aux.resize(k + 5);
aux[0].push_back(0);
for(int i = 1 ; i <= n ; ++i) {
scanf("%lld" , &v[i]);//f >> v[i];
sum += v[i];
aux[sum % k].push_back(i);
}
int sol = solve(b) - solve(a - 1);
printf("%lld" , sol);//g << sol;
return 0;
}
long long solve(long long nr) {
long long sum = 0 , sol = 0;
memset(p , 0 , sizeof(p));
memset(dp , 0 , sizeof(dp));
dp[0] = 1;
for(int i = 1 ; i <= n ; ++i) {
sum += v[i];
++dp[sum % k];
while(p[sum % k] < aux[sum % k].size() && aux[sum % k][p[sum % k]] < i - nr) {
++p[sum % k];
--dp[sum % k];
}
sol += dp[sum % k] - 1;
}
return sol;
}