zoukankan      html  css  js  c++  java
  • POJ3070Fibonacci(矩阵快速幂+高效)

    Fibonacci
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 11587   Accepted: 8229

    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:

    .

    题意:就是求斐波那契数列,只是有点大,递推也会超时,矩阵快速幂0ms,搞定;

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int N = 2;
     7 const int mod = 10000;
     8 struct Mat
     9 {
    10     int mat[2][2];
    11 };
    12 Mat operator * (Mat a, Mat b)
    13 {
    14     Mat c;
    15     memset(c.mat, 0, sizeof(c.mat));
    16     for(int k = 0; k < N; k++)
    17     {
    18         for(int i = 0; i < N; i++)
    19         {
    20             for(int j = 0; j < N; j++)
    21             {
    22                 c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j] % mod) % mod;
    23             }
    24         }
    25     }
    26     return c;
    27 }
    28 Mat operator ^ (Mat a, int k)
    29 {
    30     Mat c;
    31     for(int i = 0; i < N; i++)
    32         for(int j = 0; j < N; j++)
    33             c.mat[i][j] = (i == j);
    34     while(k)
    35     {
    36         if(k & 1)
    37             c = c * a;
    38         a = a * a;
    39         k >>= 1;
    40     }
    41     return c;
    42 }
    43 int main()
    44 {
    45     int n;
    46     while(scanf("%d", &n) != EOF)
    47     {
    48         if(n == -1)
    49             break;
    50         if(n == 0)
    51             printf("0
    ");
    52         else if(n == 1)
    53             printf("1
    ");
    54         else
    55         {
    56             Mat a;
    57             a.mat[0][0] = 1;
    58             a.mat[0][1] = 1;
    59             a.mat[1][0] = 1;
    60             a.mat[1][1] = 0;
    61             a = a ^ (n - 1);
    62             printf("%d
    ",a.mat[0][0]);
    63         }
    64     }
    65 
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5073684.html
Copyright © 2011-2022 走看看