Pagini recente » Diferente pentru autumn-warmup-2007/solutii/runda-2 intre reviziile 24 si 23 | Monitorul de evaluare | Istoria paginii runda/28_dec_2017_9 | Monitorul de evaluare | Cod sursa (job #2015487)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("divk.in");
ofstream out ("divk.out");
int n ,k ,a ,b;
int const nmax = 500000;
int sum[1 + nmax];
vector <int> v[1 + nmax];
///binary search
///gaseste in v[r] ,pos < v[r][i] && !(pos < v[r][i - 1]);
int binarysearch(int from, int to ,int pos ,int r){
if(from < to){
int mid = ((from + to) >> 1);
if(pos < v[r][mid]){
return binarysearch(from , mid , pos , r);
} else{
return binarysearch(mid + 1, to, pos ,r);
}
}
}
int main()
{
in>>n>>k>>a>>b;
v[0].push_back(0);
//cout<<0<<" ";
for(int i = 1 ; i <= n ;i++){
in>>sum[i];
sum[i] = (sum[i - 1] + sum[i]) % k;
v[sum[i] ].push_back(i);
//if(sum[i] == 0)
//cout<<i<<" ";
}
//cout<<'\n';
int sum = 0;
for(int i = 0 ; i < k ;i++){
v[i].push_back( (n << 1) );
for(int j = 0 ;j < v[i].size() - 1 ;j++){
//cout<<v[i][j]<<" ";
int x = binarysearch(0 , v[i].size() ,v[i][j] + a - 1, i);
int y = binarysearch(0 , v[i].size() ,v[i][j] + b , i);
sum += y - x;
// cout<<"("<<x<<" "<<y<<" "<<v[i][x]<<" "<<v[i][y]<<") "<<" "<<sum<<'\n';
}
//cout<<'\n';
}
out<<sum;
return 0;
}