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:
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
Đề 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
Ù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);
}