Đếm số cặp (a, b) sao cho a & b = n
2017-07-30Bài gốc
Đề bài
Cho số nguyên dương n, đếm số cặp số (a, b) sao cho a & b = n.
Giới hạn:
- 0 ≤ a,b,n ≤ 2k
- 1 ≤ k ≤ 30
Định dạng test
Input:
- Chứa duy nhất một dòng là n.
Output:
- In ra số cặp số (a, b): a & b = n chia lấy dư cho 109 + 7.
Ví dụ:
Có 3 cặp số (a, b) thoả mãn là: (5, 5), (7, 5), (5, 7).
Thuật toán
Duyệt qua k bit của n, tại bit thứ i:
- Nếu bit = 0, có 3 khả năng để có kết quả là 0: 0&0, 1&0, 0&1. Nghĩa là có 3 khả năng cho bit thứ i của số a và b, nhân 3 vào kết quả.
- Nếu bit = 1, có 1 khả năng để có kết quả là 1: 1 & 1. Tương tự, nhân 1 vào kết quả.
Source code
Ngôn ngữ: C++.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const ll MOD = 1e9 + 7;
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// input
int n, k;
cin >> n >> k;
//solve
ll res = 1;
for(int i = 0; i < k; i++)
if ((n&(1<<i)) == 0) (res *= 3) %= MOD;
// ouput
cout << res;
return 0;
}
Độ phức tạp
O(k)