Bài toán Số học

Xem PDF

Điểm: 1700 (p) Thời gian: 0.4s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Một ngày, khi học sinh lớp \(1\) đang học về số học, giáo sư Wu Zi Mu đã ra bài tập như sau:

“Định nghĩa \(F(N)\) là số ước nguyên dương của \(N\). Ví dụ: \(F(12)=6,F(5)=2\).

Cho \(Q\) truy vấn, mỗi truy vấn chứa hai số \(A,B\). Nhiệm vụ là đếm tất cả số \(X\) nằm trong khoảng [A,B] mà \(F(X)\) là số nguyên tố lớn hơn \(2\).”

Học sinh lớp \(1\) đang cố tìm cách để giải bài này, nhưng không tìm ra được. Các bạn hãy giúp cho các học sinh đó nhé.

Input

  • Gồm \(Q+1\) dòng:
  • Dòng đầu tiên gồm số \(Q\) là số truy vấn.
  • \(Q\) dòng tiếp theo, mỗi dòng chứa 2 số nguyên \(A,B\).

Output

  • Gồm \(Q\) dòng là kết quả của \(Q\) truy vấn .

Constraints

  • \(1 \leq A,B \leq 10^{12}\)
  • \(1 \leq Q \leq 10^{5}\)

Scoring

  • Subtask \(1\) (\(30\%\) số điểm): \(1 \leq A,B \leq 10^{3}, Q \leq 10^3\).
  • Subtask \(2\) (\(30\%\) số điểm): \(1 \leq A,B \leq 10^{6}, Q \leq 10^5\).
  • Subtask \(3\) (\(40\%\) số điểm): Không có ràng buộc gì thêm.

Example

Test 1

Input
2
3 25
1 100 
Output
4
7

Bình luận


  • 0
    from_Phenikaa_with_love    1:10 a.m. 17 Tháng 10, 2021

    admin cho time limit chặt quá.


    • 6
      longkold00    8:58 a.m. 4 Tháng 10, 2021 chỉnh sửa 4

      Mình có 1 số ý tưởng của bài này và muốn chia sẻ cho mọi người cùng thảo luận như sau:

      1. Ta nhận thấy số truy vấn lớn + giới hạn A,B lớn và quỹ thời gian giới hạn là 0.4s, yêu cầu ta phải giải các truy vấn trong ít nhất là O(1).

      2. Bài toán đề cập tới số ước nguyên dương, nếu dùng sàng bình thường thì với bộ dữ liệu 10^12 chắc chắn sẽ tle, nên chắc chắn sẽ có điều gì đó đặc biệt.

      3. Đề bài yêu cầu số lượng ước phải là 1 số nt lớn hơn 2??? tức có nghĩ là số ước phải là 1 số LẺ + Nguyên tố. mà 1 số như vậy thì sẽ phải được tạo nên từ hàm mũ của 1 số nguyên tố với số mũ là 1 số nguyên tố trừ đi 1 (theo công thức tính số ước)

      4. Từ ý 3, chúng ta chỉ cần sàng nguyên tố đến các số <=10^6 do số phải đc tạo ít nhất từ mũ 3-1=2 :V


      Bây giờ chúng ta sẽ xử lý các truy vấn như sau:

      1. tạo 1 mảng chứa 11 số nguyên số đầu tiên (không kể số 2), và giảm các số đó đi 1 đơn vị x[11]={2,4,6,10,12,16,18,22,28,30,36}

      2. ta tạo 1 hàm duyệt để nạp các số h thỏa mãn đề bài vào 1 mảng a[] như sau:

      nếu h>=1000 ta nạp h^2 vào a[]

      nếu h<1000 ta dùng vòng for duyệt từng phần tử trong mảng x[],nếu h^x[i]<=lim (ở đây là 10^12) ta nạp vào a[],ngược lại ta dừng vòng lặp.

      1. sử dụng sàng và hàm duyệt để hoàn thành mảng a[] chứa các số thỏa mãn, sau đó sort chúng lại

      2. với mỗi truy vấn ta sử dụng chặt nhị phân để tìm chỉ số của số >=A và >B, sau đó tính số số thỏa mãn là đc.

      3 phản hồi

      • -1
        tuanha2    6:49 p.m. 16 Tháng 3, 2021

        Em xin idea this problem


        • 0
          N7hoatt    10:03 a.m. 30 Tháng 7, 2020 chỉnh sửa 2
          1 phản hồi

          • 13
            letangphuquy    11:56 p.m. 28 Tháng 7, 2020

            Bài này cá nhân mình thấy rất là hay, cảm ơn vì ý tưởng của người ra đề. Tuy nhiên đáng buồn là mặc dù chỉ nhập vào 10^5 số, mình không dùng lệnh tắt đồng bộ ios.... thì tạch time limit còn thêm vào thì AC với thời gian khá tốt (tiệm cận người ra đề), làm mình debug cả buổi tối không hiểu vì sao sai 😢 (cho tới khi tự sinh test max cho chạy thử trên máy)

            2 phản hồi