Hướng dẫn giải của COPRIME


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.

Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.

Bạn phải đăng nhập để mở lời giải này.

Đăng nhập

Tác giả: Hiếu Nguyễn, Nguyendo, sigmavnzzzzzzz, hoangtran1

Hiểu bài toán

Bài toán yêu cầu kiểm tra xem hai số nguyên dương a và b có phải là cặp số nguyên tố cùng nhau (coprime) hay không. Hai số được gọi là nguyên tố cùng nhau nếu ước số chung lớn nhất (GCD) của chúng bằng 1. Input gồm hai số a, b, output là 'YES' nếu chúng nguyên tố cùng nhau, ngược lại输出 'NO'.

Các cách tiếp cận

Cách Sử dụng hàm có sẵn (__gcd)
#include <bits/stdc++.h>
using namespace std;
int main() {
    freopen("COPRIME.INP", "r", stdin);
    freopen("COPRIME.OUT", "w", stdout);
    long long a, b; cin >> a >> b;
    if (__gcd(a, b) == 1) cout << "YES";
    else cout << "NO";
}
  • Time Complexity: O(log(min(a, b)))
  • Space Complexity: O(1)

Đây là cách tiếp cận trực tiếp nhất. Hàm __gcd(a, b) trong thư viện <algorithm> hoặc <numeric> (tùy phiên bản C++) sử dụng thuật toán Euclid để tính ước chung lớn nhất. Độ phức tạp logarithmic. Cần lưu ý về việc khai báo kiểu dữ liệu (long long) nếu số lớn và mở file input/output đúng cách.

Cách Thuật toán Euclid (tự cài đặt)
#include <iostream>
using namespace std;

long long gcd(long long a, long long b) {
    while (b != 0) {
        long long temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int main() {
    freopen("COPRIME.INP", "r", stdin);
    freopen("COPRIME.OUT", "w", stdout);
    long long a, b;
    cin >> a >> b;
    if (gcd(a, b) == 1) cout << "YES";
    else cout << "NO";
    return 0;
}
  • Time Complexity: O(log(min(a, b)))
  • Space Complexity: O(1)

Nếu không muốn dựa vào hàm có sẵn, ta có thể tự cài đặt thuật toán Euclid. Thuật toán này dựa trên nguyên lý GCD(a, b) = GCD(b, a % b). Nó lặp lại quá trình này cho đến khi số thứ hai bằng 0. Đây là nền tảng cho cách tiếp cận đầu tiên.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(log(min(a, b))) O(1) Sử dụng hàm có sẵn (__gcd)
2 O(log(min(a, b))) O(1) Thuật toán Euclid (tự cài đặt)

Bài học kinh nghiệm

  • Hai số nguyên dương nguyên tố cùng nhau khi và chỉ khi GCD của chúng bằng 1.
  • Thuật toán Euclid là phương pháp hiệu quả nhất để tính GCD với độ phức tạp O(log(min(a, b))).

Lỗi thường gặp

  • Sử dụng kiểu dữ liệu int thay vì long long có thể gây tràn số (overflow) nếu a hoặc b lớn hơn 2*10^9.
  • Quên mở file input/output (freopen) hoặc sai tên file会导致 bài toán không đọc được dữ liệu hoặc không ghi được kết quả.

Bình luận

Please read the guidelines before commenting.


Không có bình luận tại thời điểm này.