VOI 17 Bài 2 - Dãy Fibonacci

View as PDF

Submit solution

Points: 1.00 (partial)
Time limit: 1.0s
Memory limit: 256M
Input: stdin
Output: stdout

Problem type
Allowed languages
C, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch

Đọc đề gốc tại đây.

Năm 1202, Leonardo Fibonacci, nhà toán học người Ý, tình cờ phát hiện ra tỉ lệ vàng 0.618 được tiệm cận bằng thương của hai số liên tiếp trong một loại dãy số vô hạn được một số nhà toán học Ấn Độ xét đến từ năm 1150. Sau đó dãy số này được đặt tên là dãy số Fibonacci ~{F_i: i = 1, 2, \ldots}~, trong đó ~F_1 = F_2 = 1~ và mỗi số tiếp theo trong dãy được tính bằng tổng của hai số ngay trước nó. Đây là 10 số đầu tiên của dãy Fibonacci: ~1, 1, 2, 3, 5, 8, 13, 21, 34, 55~. Người ta đã khám phá ra mối liên hệ chặt chẽ của số Fibonacci và tỉ lệ vàng với sự phát triển trong tự nhiên (cánh hoa, cành cây, vân gỗ), trong vũ trụ (hình xoáy trôn ốc dải ngân hà, khoảng cách giữa các hành tinh), hay sự cân đối của cơ thể con người. Đặc biệt số Fibonacci được ứng dụng mạnh mẽ trong kiến trúc (Kim tự tháp Ai Cập, tháp Eiffel), trong mỹ thuật (các bức tranh của Leonardo da Vinci), trong âm nhạc (các bản giao hưởng của Mozart) và trong nhiều lĩnh vực khoa học kĩ thuật.

Trong toán học, dãy Fibonacci là một đối tượng tổ hợp quan trọng có nhiều tính chất đẹp. Có nhiều phương pháp hiệu quả liệt kê và tính các số Fibonacci như phương pháp lặp hay phương pháp nhân ma trận.

Sau khi được học về dãy số Fibonacci, Sơn rất muốn phát hiện thêm những tính chất của dãy số này. Vì thế Sơn đặt ra bài toán sau đây: Hỏi rằng có thể tìm được một tập con các số trong ~n~ số Fibonacci liên tiếp bắt đầu từ số thứ ~i~, sao cho tổng của chúng chia hết cho một số nguyên dương ~k~ ~(k \le n)~ cho trước hay không? Nhắc lại, một tập con ~q~ số của một dãy ~n~ số là một cách chọn ra ~q~ số bất kỳ trong số ~n~ số của dãy đó, mỗi số được chọn không quá một lần.

Yêu cầu: Hãy giúp Sơn giải quyết bài toán đặt ra.

Input

  • Dòng thứ nhất ghi số nguyên dương ~T~ ~(T \le 10)~ là số lượng bộ dữ liệu
  • Mỗi dòng trong ~T~ dòng tiếp theo chứa ba số nguyên dương ~n~, ~i~ và ~k~ là thông tin của một bộ dữ liệu.

Các số trên cùng dòng được ghi cách nhau bởi dấu cách.

Output

Ghi ra ~T~ dòng tương ứng với kết quả của ~T~ bộ dữ liệu đầu vào, mỗi dòng có cấu trúc như sau: Đầu tiên ghi số nguyên ~q~ là số lượng các số trong tập con tìm được, tiếp đến ghi ~q~ số nguyên là các số thứ tự trong dãy Fibonacci của ~q~ số trong tập con tìm được. Nếu không tìm được tập con thoả mãn điều kiện đặt ra thì ghi ra một số ~0~.

Nếu có nhiều cách chọn thì chỉ cần đưa ra một cách chọn bất kỳ.

Giới hạn

  • Có ~20\%~ số lượng test thoả mãn điều kiện: ~n \le 20, i \le 10^6~;
  • Có ~20\%~ số lượng test khác thoả mãn điều kiện: ~n \le 10^3, i \le 10^6~;
  • Có ~20\%~ số lượng test khác thoả mãn điều kiện: ~n \le 10^6, i \le 10^6~;
  • Có ~10\%~ số lượng test khác thoả mãn điều kiện: ~n \le 20, i \le 10^{15}~;
  • Có ~10\%~ số lượng test khác thoả mãn điều kiện: ~n \le 10^3, i \le 10^{15}~;
  • ~20\%~ số lượng test còn lại thoả mãn điều kiện: ~n \le 10^6, i \le 10^{15}~.

Sample Input

1
10 3 9

Sample Output

4 3 4 5 6

Note

Giải thích: Trong test ví dụ, một tập con thoả mãn điều kiện đặt ra là tập gồm 4 số ~F_3 = 2, F_4 = 3, F_5 = 5, F_6 = 8~ với tổng bằng ~18~.

In case the statement didn't load correctly, you can download the statement here: Statement


Comments

Please read the guidelines before commenting.



  • -6
    This_is_a_name   commented on Oct. 8, 2021, 7:30 p.m. edited

    This comment is hidden due to too much negative feedback. Show it anyway.


    • 0
      DeMen100ns   commented on Feb. 28, 2022, 11:38 a.m. edited

      Nhiệm vụ của bạn là chứng minh chỉ cần dùng đoạn con liên tiếp đấy :)), nếu không chứng minh được thì bạn không làm được sub3 và 6 đâu ._.


    • -4
      Duy_e   commented on Oct. 14, 2021, 1:59 p.m.

      Đề đúng thế mà.