POJ 3070 Fibonacci(矩阵快速幂)

    xiaoxiao2026-03-02  6

    Fibonacci Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 13147 Accepted: 9348

    Description

    In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:

    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

    An alternative formula for the Fibonacci sequence is

    .

    Given an integer n, your goal is to compute the last 4 digits of Fn.

    Input

    The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.

    Output

    For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

    Sample Input

    0 9 999999999 1000000000 -1

    Sample Output

    0 34 626 6875

    Hint

    As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

    .

    Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

    .

    题意:求解斐波那契数列第n项对1e4取模的结果。

    思路:运用矩阵快速幂即可

    <pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<iostream> #include<algorithm> #include<queue> #include<set> #include<map> #include<cctype> using namespace std; typedef long long ll; const int M = 1e4; struct Mar { int a[2][2]; Mar(int ha = 0) { memset(a, 0, sizeof a); } void init() { a[0][0] = a[0][1] = a[1][0] = 1; a[1][1] = 0; } void dan() { //矩阵单位化 memset(a, 0, sizeof a); a[0][0] = a[1][1] = 1; } Mar& operator = (const Mar &Rhs); friend Mar operator * (const Mar &A, const Mar &B); }; Mar& Mar::operator = (const Mar &Rhs) { for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) a[i][j] = Rhs.a[i][j]; return *this; } Mar operator * (const Mar &A, const Mar &B) { Mar C; for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) C.a[i][j] = (C.a[i][j] + A.a[i][k] * B.a[k][j] % M) % M; return C; } Mar my_pow(Mar& A, ll n) { Mar Ans; if (n == 0) { Ans.dan(); return Ans; } Ans = my_pow(A, n/2); Ans = Ans * Ans; if (n % 2) Ans = Ans * A; return Ans; } void solve(ll n) { Mar A; A.init(); Mar Ans = my_pow(A,n); cout << Ans.a[1][0] << endl; } int main() { ll n; while(cin >> n && n+1) { solve(n); } }

    转载请注明原文地址: https://ju.6miu.com/read-1307543.html
    最新回复(0)