[Lý Thuyết Số - Toán Học]. Bài 100. Sàng phi hàm Euler

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Nguồn bài:
28Tech
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch

Cho số nguyên dương N, liệt kê phi hàm euler của các số số từ 1 tới N và in ra màn hình.

Phi hàm euler của số X thể hiện số lượng số nguyên tố cùng nhau với X nằm trong khoảng từ [1, X].


Đầu vào
  • Số nguyên N

Giới hạn
  • 1≤N≤10^6

Đầu ra
  • In ra phi hàm euler của các số từ 1 tới N

Ví dụ :

Input 01
15
Output 01
1 1 2 2 4 2 6 4 6 4 10 4 12 6 8

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    willingtodo  đã bình luận lúc 11, Tháng 4, 2025, 13:59
    void sieve(int n) {
        for (int i = 0; i <= n; i++) phi[i] = i;
        for (int i = 2; i <= n; i++) {
            if (phi[i] == i) {
                for (int j = i; j <= n; j += i) {
                    phi[j] -= phi[j] / i;
                }
            }
        }
    }
    
    sieve(n);
        for (int i = 1; i <= n; i++) {
            if (phi[i] == i - 1) cout << i << " "; 
            else cout << phi[i] << " ";
        }
    

  • -1
    bengokyeuanh99  đã bình luận lúc 11, Tháng 4, 2025, 11:47

    Đề nói một đằng, ví dụ làm một nẻo làm ngồi check lú lun

    Đề nói: "Tính phi hàm Euler từ 1 đến N" tức là phải in ra phi(1), phi(2), ..., phi(N) theo định nghĩa chuẩn của toán học.

    Nhưng ví dụ lại in:

    phi(5) in ra 5, trong khi kết quả đúng là 4 (vì {1,2,3,4} là 4 số nguyên tố cùng nhau với 5).

    phi(11) in ra 11, trong khi kết quả đúng là 10.

    Bài này bịp ngầm

    Đề yêu cầu 1 đằng, nhưng ví dụ kiểm tra lại là 1 nẻo.

    Nếu code theo đúng định nghĩa phi hàm Euler thì sẽ bị sai test.

    Muốn đúng test thì phải “chơi trò giả ngu”:

    Nếu phi(x) == x - 1 (tức x là số nguyên tố) thì in x luôn,

    Còn lại thì in phi(x) như bình thường


  • 0
    bengokyeuanh99  đã bình luận lúc 11, Tháng 4, 2025, 9:25 sửa 4

    Ùi dời ơi tốn nữa buổi giải bài này Công nhận khoai ác ra Giải bằng py thì bị quá thời gian miết

    Code cho ae tham khảo và cmt trên có giải thích đấy

    include <iostream>

    include <vector>

    using namespace std;

    // Sàng Euler tính mảng phi[] cho 1 đến n // (phi[x] = số lượng số nguyên ≤ x nguyên tố cùng nhau với x) inline vector<int> computeTotients(int n) { vector<int> phi(n + 1); for (int i = 0; i <= n; ++i) { phi[i] = i; } for (int i = 2; i <= n; ++i) { if (phi[i] == i) { // i là số nguyên tố for (int j = i; j <= n; j += i) { phi[j] -= phi[j] / i; } } } return phi; }

    int main() { ios::syncwithstdio(false); cin.tie(nullptr);

    int n;
    cin >> n;
    
    const auto phi = computeTotients(n);
    
    // In kết quả: nếu số nguyên x là số nguyên tố (phi[x] == x - 1)
    // theo đề bài yêu cầu in ra x thay vì phi(x)
    for (int x = 1; x <= n; ++x) {
        if (x > 1) cout.put(' ');
        cout << (phi[x] == x - 1 ? x : phi[x]);
    }
    
    cout.put('\n');
    return 0;
    

    }