Tổng chính phương

Xem dạng PDF

Gửi bài giải

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

Tác giả:
Người đăng:
Dạng bài
Ngôn ngữ cho phép
C, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch

Số chính phương được định nghĩa là bình phương của một số nguyên.

Yêu cầu: Với số n cho trước, hãy tính tổng các số chính phương trong đoạn từ 1 đến n.

Input

  • Dòng đầu tiên chứa q ~(q \le 10^4)~ - số truy vấn.
  • q dòng tiếp mỗi dòng chứa số nguyên dương n ~(n \le 10^{18})~

Output

  • Mỗi dòng chứa tổng S sau khi đã mod cho ~10^9 + 7~

Example

Input:

1
1

Output:

1

Bình luận

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



  • 0
    duy_  đã bình luận lúc 21, Tháng 10, 2024, 8:29

    chúc Anh Em 8386 vạn sự như ý, triệu sự như mơ, tỷ sự bất ngờ ngập tràn may mắn chúc Anh Em MÃI ĐỈNH MÃI ĐỈNH MÃI ĐỈNH LUÔN


  • 17
    Shinoz  đã bình luận lúc 6, Tháng 10, 2023, 10:56

    Solution By Shinoz

    • Hint 1:

      Đề yêu cầu: tính số chính phương từ ~1~ -> ~n~ với ~n~ bất kì trong đoạn ~1~ -> ~10^{18}~

      Ta thấy: số chính phương gấn n nhất là: ~sqrt(n)~ (chỉ lấy phần nguyên)

      Đặt ~m = sqrt(n)~. Ta có công thức tính bình phương từ ~1~ -> ~m = m(m + 1)(2m + 1)~

      có thể tìm kiếm trên mạng

    • Hint 2:

      Việc tính ~maxn = 10^{18}~ hay ~= 10^{9}~ (sau khi lấy căn) sẽ làm tràn số nên ta phải sử dụng tính chất đồng dư modulo / nghịch đảo modulo

    • Modular arithmetic:

      Có thể bị sai số khi sử dụng nên ta phải kiểm tra x * y mod 6 = 0 ?

      M ~= 10^{9} + 7~

      TH1: m * (m + 1) mod 6 = 0

      TH2: m * (2m + 1) mod 6 = 0

      TH3: (m + 1)(2m + 1) mod 6 = 0

    • Modular multiplicative inverse:

      Ngược lại với cộng / nhân, (a / b) mod M có thể sẽ khác(a mod M) / (b mod M)

      Ta có:

      (a / b) mod M = (a * ~b^{-1}~) mod M = (a mod M) * (~b^{-1}~ mod M) mod M

      Vì M là số nguyên tố nên theo định lý Fermat, ta có: ~b^{-1}~ mod M = ~b^{(M - 2)}~

      Chỉ hoạt động khi M là số nguyên tố

      Có thể tính trước ~6^{M - 2}~ rồi lắp vào công thức tính (sử dụng AI / search google / sử dụng chia để trị)

    Document

    Another solution

    • Sử dụng công thức ở Hint 1 + BigNum hoặc dữ liệu __int128 (C++)
    • Sử dụng nhân ma trận

    • 9
      admin  đã bình luận lúc 9, Tháng 10, 2023, 9:10

      Chất quá Shinoz ơi!


    • -6
      ht_maths2512  đã bình luận lúc 7, Tháng 10, 2023, 8:46

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


  • -2
    Shinoz  đã bình luận lúc 5, Tháng 10, 2023, 11:49 chỉnh sửa

    ngầu quá ngầu quá nma sol thiếu sót vl


  • -2
    ht_maths2512  đã bình luận lúc 5, Tháng 10, 2023, 10:22 chỉnh sửa

    Sử dụng module và dùng công thức Tổng bình phương các số từ 1 Đến Căn bậc Hai của N

    Ta có Công thức (A*B) mod m = (A mod m * B mod m) mod m 
                    Đến Đây đã có thế xử lí được việc tràn số 
           Nếu muốn xử lí với số lớn hơn ta có thể Phân tách ra thêm bằng các Công Thức 
                 Phép cộng: (A+B) mod m = A mod m + B mod m
    

    Lưu ý : Với bài này ta có thể dùng kiểu dữ liệu __int128 để giải quyết bằng cách ép kiểu

    ** Với sự đam mê các công thức này để có thể tìm ở trên mạng


    • -6
      ht_maths2512  đã bình luận lúc 5, Tháng 10, 2023, 14:55

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


      • -4
        Shinoz  đã bình luận lúc 5, Tháng 10, 2023, 15:40

        nghịch đảo modulo (tuy không cần thiết vì vẫn dùng tính chất đồng dư được)