กำหนดอาร์เรย์ nums ขนาด n ต้องจัดประเภทว่า:
- Pairwise Coprime:
gcd(nums[i], nums[j]) = 1สำหรับทุกคู่i < j - Setwise Coprime:
gcd(nums[0], nums[1], ..., nums[n-1]) = 1(แต่ไม่ใช่ pairwise) - Not Coprime:
gcdของทั้งชุด > 1
ตัวอย่าง: n=4, nums={7,11,13,17} ผลลัพธ์: The numbers are pairwise coprime
ขั้นตอนการแก้ปัญหา
- คำนวณ
gcdVal= GCD ของทั้งอาร์เรย์ พร้อมนับความถี่fac[x] - ถ้า
gcdVal != 1→ Not Coprime - ถ้า
gcdVal == 1ตรวจสอบ pairwise:- ใช้ Sieve แบบง่าย: สำหรับจำนวนเฉพาะ
kนับจำนวนตัวในอาร์เรย์ที่หารด้วยkลงตัว (c) - ถ้ามี
kใดที่c > 1→ ไม่ใช่ pairwise
- ใช้ Sieve แบบง่าย: สำหรับจำนวนเฉพาะ
- ถ้า pairwise จริง → Pairwise Coprime มิฉะนั้น → Setwise Coprime
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void solve(int n, int nums[]) {
int fac[100] = {0};
bool checkPrime[100] = {0};
int gcdVal = 0;
for (int i = 0; i < n; i++) {
gcdVal = __gcd(nums[i], gcdVal);
++fac[nums[i]];
}
if (gcdVal == 1) {
bool pw = true;
for (int k = 2; k < 100; ++k) {
if (checkPrime[k]) continue;
int c = 0;
for (int j = k; j < 100; j += k) {
c += fac[j];
checkPrime[j] = true;
}
pw = pw && c <= 1;
}
if (pw) cout << "The numbers are pairwise coprime";
else cout << "The numbers are setwise coprime";
} else {
cout << "The numbers are not coprime";
}
}
int main() {
int n = 4, nums[] = {7, 11, 13, 17};
solve(n, nums);
return 0;
}
อินพุต / เอาต์พุต
Input: 4, {7, 11, 13, 17}
Output: The numbers are pairwise coprime