[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
    NTH11112222  đã bình luận lúc 21, Tháng 7, 2025, 14:09

    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){ for(int j = i; j <= n; j += i){ phi[j] -= phi[j] / i; } } } for(int i = 1; i <= n; i++) cout << phi[i] << " ";


  • -4
    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] << " ";
        }
    

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

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


    • -3
      dungdeptrai  đã bình luận lúc 25, Tháng 4, 2025, 8:50

      :))))


      • -4
        bengokyeuanh99  đã bình luận lúc 25, Tháng 4, 2025, 10:46

        Cười zì ấy b :v


        • -4
          dungdeptrai  đã bình luận lúc 25, Tháng 4, 2025, 15:02

          mik k load đc ý của bạn nên hơi lú. Vậy đề này bịp đúng k bạn


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

            Input với output hôm tui làm ấy, giờ ô ad update lại input với output rồi


          • -2
            bengokyeuanh99  đã bình luận lúc 25, Tháng 4, 2025, 15:09

            input output của hôm tui làm nè giờ ô ad update lại rồi


  • -4
    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;
    

    }