Fibo cơ bản

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Clang++, Cobol, D, Groovy, Haskell, Java, JS, Kotlin, Lua, Node JS, ObjectiveC, OCaml, Output, Pascal, Perl, PHP, Prolog, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 200 (p) Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Một đôi thỏ (gồm một thỏ đực và một thỏ cái) cứ mỗi tháng đẻ được một đôi thỏ con (cũng gồm một thỏ đực và thỏ cái); một đôi thỏ con, khi tròn 2 tháng tuổi, sau mỗi tháng đẻ ra một đôi thỏ con, và quá trình sinh nở cứ thế tiếp diễn. Hỏi sau \(n\) tháng có bao nhiêu đôi thỏ, nếu đầu năm (tháng Giêng) có một đôi thỏ sơ sinh

Trong hình vẽ trên, ta quy ước:

  • Cặp thỏ nâu là cặp thỏ có độ tuổi \(1\) tháng.
  • Cặp thỏ được đánh dấu (màu đỏ và màu xanh) là cặp thỏ có khả năng sinh sản.

Nhìn vào hình vẽ trên ta nhận thấy:

  • Tháng Giêng và tháng Hai: Chỉ có \(1\) đôi thỏ.
  • Tháng Ba: đôi thỏ này sẽ đẻ ra một đôi thỏ con, do đó trong tháng này có \(2\) đôi thỏ.
  • Tháng Tư: chỉ có đôi thỏ ban đầu sinh con nên đến thời điểm này có \(3\) đôi thỏ.
  • Tháng Năm: có hai đôi thỏ (đôi thỏ đầu và đôi thỏ được sinh ra ở tháng Ba) cùng sinh con nên ở tháng này có \(2 + 3 = 5\) đôi thỏ.
  • Tháng Sáu: có ba đôi thỏ (\(2\) đôi thỏ đầu và đôi thỏ được sinh ra ở tháng Tư) cùng sinh con ở thời điểm này nên đến đây có \(3 + 5 = 8\) đôi thỏ.

Khái quát, nếu \(n\) là số tự nhiên khác \(0\), gọi \(f(n)\) là số đôi thỏ có ở tháng thứ \(n\), ta có:

  • Với \(n=1\) ta được \(f(1)=1\).
  • Với \(n=2\) ta được \(f(2)=1\).
  • Với \(n=3\) ta được \(f(3)=2\).
  • Do đó với \(n>2\) ta được: \(f(n)=f(n−1)+f(n−2)\).

Nguồn: wikipedia

Dãy số trên gọi là dãy số \(Fibonacci\) và được định nghĩa như sau:

  • \(F_1=F_2=1;\)
  • \(\dots\)
  • \(F_n=F_{n−2}+F_{n−1}\)

Hãy viết chương trình tính các số \(Fibonacci\) thứ \(a[i]\).

Input

  • Gồm \(T\) dòng (\(T \le 10^6\)), dòng thứ \(i\) chứa số \(a[i]\) (\(a[i] \le 1000\)).

Output

  • Gồm \(T\) dòng, dòng thứ \(i\) chứa số \(F_{a[i]}\).

Scoring

  • Subtask \(1\) (\(25\%\) số điểm): \(T = 5\)\(a[i] \le 75\).
  • Subtask \(2\) (\(25\%\) số điểm): \(a[i] \le 75\).
  • Subtask \(3\) (\(50\%\) số điểm): Không có ràng buộc gì thêm.

Example

Test 1

Input
1
2
7
24
31
1 
Output
1
1
13
46368
1346269
1

Bình luận


  • 1
    SBD20_Caominhduc    4:20 p.m. 7 Tháng 8, 2024
    #include <bits/stdc++.h>
    #define ll long long
    const int N=1e6+3;
    using namespace std;
    ll n,dem=0;
    string st,a[N];
    string csl(string a, string b)
    {
        int     du  = 0;
        int     mid = 0;
        string  res = "";
        a.insert(0, max(0, (int) (b.length() - a.length())), '0');
        b.insert(0, max(0, (int) (a.length() - b.length())), '0');
        for (int i = a.length()-1; i >= 0; --i)
        {
            mid = ((int) a[i] - 48) + ((int) b[i] - 48) + du;
            du  = mid / 10;
            res = (char) (mid % 10 + 48) + res;
        }
        if (du > 0) res = "1" + res;
        return res;
    }
    string to_str(ll n)
    {
        string s="";
        while(n>0)
        {
            s=char(n%10+48)+s;
            n/=10;
        }
        reverse(s.begin(),s.end());
        return s;
    }
    int main()
    {
        ios_base::sync_with_stdio(0);
        cin.tie(NULL);
        a[1]=a[2]="1";
        for(ll i=3;i<=1000;i++)
        {
            a[i]=csl(a[i-1],a[i-2]);
        }
        while(cin >> n)
        {
            cout << a[n] << '\n';
        }
        return 0;
    }
    

    Spoiler

    Code C++ sử dụng xâu cho ai cần

    • 4 bình luận nữa