zoukankan      html  css  js  c++  java
  • nyist 148 fibonacci数列(二)

    fibonacci数列(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
    描述

    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.

    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:

    .

    输入
    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.
    输出
    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).
    样例输入
    0
    9
    1000000000
    -1
    样例输出
    0
    34
    6875

    解题方法:
    使用矩阵的来解决
    1,1
    1,0
    的n次幂就能得到我们要的结果了
    证明和具体的思路课参照网上的资料

    下面是实现代码
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 
     5 using namespace std;
     6 
     7 #define N 10000
     8 
     9 typedef struct matrix
    10 {
    11     long long a[2][2];
    12     matrix()
    13     {
    14         memset(a,0,sizeof(a));
    15     }
    16 }matrix;
    17 
    18 void  chenfa(matrix x,matrix y,matrix &z)
    19 {
    20 
    21         z.a[0][0] = (x.a[0][0]*y.a[0][0] + x.a[0][1]*y.a[1][0]) % N;
    22         z.a[0][1] = (x.a[0][0]*y.a[0][1] + x.a[0][1]*y.a[1][1]) % N;
    23         z.a[1][0] = (x.a[1][0]*y.a[0][0] + x.a[1][1]*y.a[1][0]) % N;
    24         z.a[1][1] = (x.a[1][0]*y.a[0][1] + x.a[1][1]*y.a[1][1]) % N;
    25 }
    26 
    27 void kuaishu(matrix x,matrix &z,long long n)
    28 {
    29     z.a[0][0] = 1;
    30     z.a[0][1] = 0;
    31     z.a[1][0] = 0;
    32     z.a[1][1] = 1;
    33 
    34     while(n)
    35     {
    36         if(n % 2 == 1)
    37             chenfa(z,x,z);
    38         n /= 2;
    39         chenfa(x,x,x);
    40     }
    41 
    42 }
    43 
    44 /*void print(matrix z)
    45 {
    46     int i = 0;
    47     int j = 0;
    48     for(i = 0; i< 2; i++)
    49         {
    50             for(j = 0; j< 2;j++)
    51                 printf("%d ",z.a[i][j]);
    52                 printf("\n");
    53         }
    54 }
    55 */
    56 int main()
    57 {
    58     long long n;
    59     while(1)
    60     {
    61         scanf("%lld",&n);
    62         if(n == -1)
    63             break;
    64 
    65         if(n < 3)
    66         {
    67             if(n == 0)
    68                 printf("0\n");
    69             else
    70             printf("1\n");
    71         }
    72         else
    73         {
    74             matrix z;
    75             matrix x;
    76             x.a[0][0] = 1;
    77             x.a[0][1] = 1;
    78             x.a[1][0] = 1;
    79             x.a[1][1] = 0;
    80             kuaishu(x,z,n);
    81             //print(z);
    82             printf("%lld\n",z.a[0][1]);
    83         }
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    547. Friend Circles
    399. Evaluate Division
    684. Redundant Connection
    327. Count of Range Sum
    LeetCode 130 被围绕的区域
    LeetCode 696 计数二进制子串
    LeetCode 116 填充每个节点的下一个右侧节点
    LeetCode 101 对称二叉树
    LeetCode 111 二叉树最小深度
    LeetCode 59 螺旋矩阵II
  • 原文地址:https://www.cnblogs.com/yyroom/p/3019874.html
Copyright © 2011-2022 走看看