Cho một số nguyên dương n. Mục tiêu là tìm số lượng cặp (i, j) sao cho tổng (i + j) là số nguyên tố và nhỏ hơn n. Điều kiện: i != j và i, j >= 1. Nếu n = 4, chỉ có 1 cặp (1, 2) vì 1+2=3 là số nguyên tố và 3 < 4.
Ví dụ
Đầu vào − n = 7
Đầu ra − 3
Giải thích − Các cặp: (1,2), (1,4), (2,3). Tổng: 3, 5, 5 đều là số nguyên tố < 7.
Đầu vào − n = 10
Đầu ra − 6
Giải thích − Các cặp: (1,2), (1,4), (2,3), (1,6), (2,5), (3,4). Tổng: 3, 5, 5, 7, 7, 7 đều là số nguyên tố < 10.
Phương pháp giải
Sử dụng sàng Sundaram để tìm tất cả số nguyên tố nhỏ hơn n trong hàm check_prime(bool check[], int temp).
Với mỗi số lẻ temp, số cặp khác nhau có tổng bằng temp là temp/2. Trừ số 2, mọi số nguyên tố đều lẻ. Với mỗi số nguyên tố temp < n, cộng temp/2 vào kết quả.
- Nhận biến
n. - Hàm
prime_pair(int n)trả về số cặp thỏa mãn. - Khởi tạo
count = 0. - Sàng Sundaram sinh số nguyên tố <
2*n+2cho đầu vàon. Giảmnxuống một nửa lưu vàotemp_2. - Tạo mảng
Check[]độ dàitemp_2đánh dấu các số dạng(i+j+2*i*j)là true. Khởi tạo tất cả false. - Gọi
check_prime(check, temp_2)để đánh dấu. - Duyệt
Check[]từi=0đếntemp_2-1:- Nếu
check[i] == false, số nguyên tốtemp = 2*i + 1. - Số cặp có tổng
templàtemp/2. - Cộng vào
count.
- Nếu
- Trả về
count.
Ví dụ code
#include <bits/stdc++.h>
using namespace std;
void check_prime(bool check[], int temp) {
for (int i = 1; i <= temp; i++) {
for (int j = i; (i + j + 2*i*j) <= temp; j++) {
check[i + j + 2*i*j] = true;
}
}
}
int prime_pair(int n) {
int count = 0;
int temp;
int temp_2 = (n - 2) / 2;
bool check[temp_2 + 1];
memset(check, false, sizeof(check));
check_prime(check, temp_2);
for (int i = 1; i <= temp_2; i++) {
if (check[i] == false) {
temp = 2*i + 1;
count += (temp / 2);
}
}
return count;
}
int main() {
int n = 10;
cout << "Count of pairs with sum as a prime number and less than n are: " << prime_pair(n);
return 0;
}
Đầu ra
Count of pairs with sum as a prime number and less than n are: 6