Pagini recente » Cod sursa (job #1657341) | Cod sursa (job #516166) | Cod sursa (job #1680462) | Cod sursa (job #2038158) | Cod sursa (job #1040356)
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
#define NMAX 500005
#define KMAX 100005
int N, K, A, B, X[NMAX];
long long sum[NMAX];
vector<int> all[KMAX];
void precompute()
{
sum[0] = 0;
for(int i = 1; i <= N; ++i)
sum[i] = sum[i-1] + X[i];
for(int i = 1; i <= N; ++i)
all[sum[i]%K].push_back(i);
}
long long solve(int n){
long long ret = 0;
//cout << "n= " << n << endl;
// check the sums with r = 0
for(unsigned i = 0; i < all[0].size(); ++i)
if(all[0][i] <= n)
++ret;
//cout << "ret=" << ret << endl;
// check for each possible remainder
for(int r = 0; r < K; ++r)
if(all[r].size() != 0){
int b = 0, e = 1, m = all[r].size();
while(b < m){
if(e < m && ((all[r][e] - all[r][b]) <= n)) ++e, ++ret;
else b++, e = b + 1;
}
//cout << r << ": " << ret << endl;
}
return ret;
}
long long solve_1()
{
return solve(B) - solve(A-1);
}
int main()
{
ifstream in("divk.in");
ofstream out("divk.out");
in >> N >> K >> A >> B;
for(int i = 1; i <= N; ++i)
in >> X[i];
precompute();
out << solve_1();
return 0;
}