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 x
1
, x
2
, …, x
N
. Pentru orice două valori i
și j
, cu 1 ≤ i ≤ j ≤ N
, vom nota prin B(i, j) = B(x
i
) + B(x
i+1
) + ... + B(x
j
)
, adică B(i, j)
este numărul tuturor biților de 1
din secvența de numere x
i
, x
i+1
, …, x
j
.
Cerința
Dat șirul x
1
, x
2
, …, x
N
și un număr natural T
, să se determine numărul secvențelor de forma x
i
, x
i+1
, …, x
j
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 x
1
, x
2
, …, x
N
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.000
0 ≤ 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 x
1
, x
2
, …, x
N
. Pentru orice două valori i
și j
, cu 1 ≤ i ≤ j ≤ N
, vom nota prin B(i, j) = B(x
i
) + B(x
i+1
) + ... + B(x
j
)
, adică B(i, j)
este numărul tuturor biților de 1
din secvența de numere x
i
, x
i+1
, …, x
j
.
Cerința
Dat șirul x
1
, x
2
, …, x
N
și un număr natural T
, să se determine numărul secvențelor de forma x
i
, x
i+1
, …, x
j
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 x
1
, x
2
, …, x
N
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.000
0 ≤ 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; }