Cho một số nguyên N được coi là ước số, nó sẽ được chia cho các số từ 1 đến N. Nhiệm vụ là đếm số ước số có số bit 1 (set bits) nhiều hơn thương khi chia N cho ước số đó.
Ví dụ
Đầu vào: N = 6
Đầu ra: Số ước số thỏa mãn: 5
Giải thích: Chia N cho 1 đến 6, so sánh số bit 1 của ước số và thương:
- 1 → 6/1=6: bit(1)=1, bit(6)=2 → 1 < 2 (không tính)
- 2 → 6/2=3: bit(2)=1, bit(3)=2 → 1 < 2 (không tính)
- 3 → 6/3=2: bit(3)=2, bit(2)=1 → 2 > 1 (tính)
- 4 → 6/4=1: bit(4)=1, bit(1)=1 → 1 = 1 (tính)
- 5 → 6/5=1: bit(5)=2, bit(1)=1 → 2 > 1 (tính)
- 6 → 6/6=1: bit(6)=2, bit(1)=1 → 2 > 1 (tính)
Kết quả: 5 trường hợp thỏa mãn.
Đầu vào: N = 10
Đầu ra: Số ước số thỏa mãn: 8
Giải thích: Tương tự, kiểm tra từ 1 đến 10, có 8 trường hợp ước số có nhiều bit 1 hơn thương.
Phương pháp sử dụng
- Nhập số nguyên dương
Nvà truyền vào hàmdivisors_quotient(). - Hàm
divisors_quotient()trả vềN - set_quo(N) + 1. - Hàm
set_quo():- Khởi tạo
start = 1,end = sqrt(N). - Vòng lặp
WHILE start < end:temp = (start + end) / 2. - Nếu
verify(temp, N)thìend = temp, ngược lạistart = temp + 1. - Nếu
!verify(start, N)trả vềstart + 1, ngược lại trả vềstart.
- Khởi tạo
- Hàm
verify(): trả vềtruenếuval_bit(temp / val) <= val_bit(val). - Hàm
val_bit(): đếm số bit 1 của số nguyên bằng cách chia liên tục cho 2.
Ví dụ mã nguồn
#include <bits/stdc++.h>
using namespace std;
int val_bit(int val) {
int count = 0;
while (val) {
val = val / 2;
count++;
}
return count;
}
bool verify(int val, int temp) {
if (val_bit(temp / val) <= val_bit(val)) {
return true;
}
return false;
}
int set_quo(int N) {
int start = 1;
int end = sqrt(N);
while (start < end) {
int temp = (start + end) / 2;
if (verify(temp, N)) {
end = temp;
} else {
start = temp + 1;
}
}
if (!verify(start, N)) {
return start + 1;
} else {
return start;
}
}
int divisors_quotient(int N) {
return N - set_quo(N) + 1;
}
int main() {
int N = 10;
cout << "Count of divisors having more set bits than quotient on dividing N are: " << divisors_quotient(N);
return 0;
}
Chạy mã trên cho kết quả:
Kết quả
Count of divisors having more set bits than quotient on dividing N are: 8