• 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 }
  • 相关阅读:
    anaconda安装
    MySQL数据库安装(windows 10 64bit)
    Redis数据库安装(windows 10 64bit)
    MongoDB可视化界面配置
    MongoDB安装(windows 10环境)
    四,程序流程控制之函数
    三,程序流程控制之顺序结构、分支结构与循环结构
    一,Python入门
    关于如何使用Python绘制基本数据图形模型
    关联分析
  • 原文地址:https://www.cnblogs.com/yyroom/p/3019874.html
Copyright © 2020-2023  润新知