Pentru un număr natural x, vom nota cu B(x) numărul biților de 1 din reprezentarea lui x în baza 2. De exemplu, B(6) = 2, B(15) = 4, B(16) = 1. Fie un șir de N numere naturale x1, x2, …, xN. Pentru orice două valori i și j, cu 1 ≤ i ≤ j ≤ N, vom nota prin B(i, j) = B(xi) + B(xi+1) + ... + B(xj), adică B(i, j) este numărul tuturor biților de 1 din secvența de numere xi, xi+1, …, xj.
Cerința
Dat șirul x1, x2, …, xN și un număr natural T, să se determine numărul secvențelor de forma xi, xi+1, …, xj cu proprietatea că B(i,j) = T.
Date de intrare
Fișierul de intrare secvb.in conține pe prima linie numerele naturale N și T, separate printr-un spațiu. Pe linia a doua se găsesc N numere naturale x1, x2, …, xN separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire secvb.out va conține un singur număr natural reprezentând numărul de secvențe din șir care au numărul biților de 1 egal cu T.
Restricții și precizări
1 <= N <= 50.0000 ≤ T ≤ 100.000- valorile din şir sunt numere naturale cuprinse între
1și1000.
Exemplul 1:
secvb.in
7 6 8 3 7 14 10 63 1
secvb.out
3
Explicație
Sunt trei secvențe având în total 6 biți de 1:
Pentru un număr natural x, vom nota cu B(x) numărul biților de 1 din reprezentarea lui x în baza 2. De exemplu, B(6) = 2, B(15) = 4, B(16) = 1. Fie un șir de N numere naturale x1, x2, …, xN. Pentru orice două valori i și j, cu 1 ≤ i ≤ j ≤ N, vom nota prin B(i, j) = B(xi) + B(xi+1) + ... + B(xj), adică B(i, j) este numărul tuturor biților de 1 din secvența de numere xi, xi+1, …, xj.
Cerința
Dat șirul x1, x2, …, xN și un număr natural T, să se determine numărul secvențelor de forma xi, xi+1, …, xj cu proprietatea că B(i,j) = T.
Date de intrare
Fișierul de intrare secvb.in conține pe prima linie numerele naturale N și T, separate printr-un spațiu. Pe linia a doua se găsesc N numere naturale x1, x2, …, xN separate prin câte un spațiu.
Date de ieșire
Fișierul de ieșire secvb.out va conține un singur număr natural reprezentând numărul de secvențe din șir care au numărul biților de 1 egal cu T.
Restricții și precizări
1 <= N <= 50.0000 ≤ T ≤ 100.000- valorile din şir sunt numere naturale cuprinse între
1și1000.
Exemplul 1:
secvb.in
7 6 8 3 7 14 10 63 1
secvb.out
3
Explicație
Sunt trei secvențe având în total 6 biți de 1:
8 3 7
7 14
63
Exemplul 2:
secvb.in
4 1 3 5 7 6
secvb.out
0
Explicație
Nu există nicio secvență pentru care suma biților de 1 să fie egală cu 1.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("secvb.in");
ofstream cout("secvb.out");
int n, T, a[50001], B[50001];
int b(int n){
int cnt = 0;
while(n)
cnt += n % 2, n /= 2;
return cnt;
}
int main(){
cin >> n >> T;
for(int i = 1; i <= n; ++i) cin >> a[i];
for(int i = 1; i <= n; ++i) B[i] = b(a[i]);
int st = 1, sum = 0, cnt = 0;
for(int i = 1; i <= n; ++i){
sum += B[i];
if(sum >= T){;
while(sum > T)
sum -= B[st], st++;
if(sum == T)
cnt++;
}
}
cout << cnt;
return 0;
}