zoukankan      html  css  js  c++  java
  • (矩阵快速幂) Fibonacci -- poj -- 3070

    链接:
     
    Fibonacci
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 11236   Accepted: 7991

    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:

    .

     

    代码:

    #include<stdio.h>
    #include<string.h>
    #define MOD 10000
    struct node
    {
        int m[2][2];
    }a, b;
    
    node cheng(node x, node y)
    {
        int i, j, k;
        node c;
    
        for(i=0; i<2; i++)
        for(j=0; j<2; j++)
        {
            c.m[i][j] = 0;
            for(k=0; k<2; k++)
                c.m[i][j] = (c.m[i][j] + x.m[i][k]*y.m[k][j])%MOD;
        }
    
        return c;
    }
    
    int Fast_MOD(int n) 
    {
        a.m[0][0] = a.m[0][1] = a.m[1][0] = 1;
        a.m[1][1] = 0;
    
        b.m[0][0] = b.m[1][1] = 1;  /// b 初始化为单位矩阵
        b.m[0][1] = b.m[1][0] = 0;
    
        while(n)
        {
            if(n&1) /// n是奇数
                b = cheng(b, a);
            a = cheng(a, a);
            n >>= 1;
        }
        return b.m[0][1];
    }
    
    int main()
    {
        int n;
        while(scanf("%d", &n), n!=-1)
        {
            printf("%d
    ", Fast_MOD(n));
        }
        return 0;
    }
    View Code

     

    勿忘初心
  • 相关阅读:
    AUSU 安装Win10注意事项
    华硕笔记本无法设置U盘启动,快捷启动不能识别
    postgres 得到所有表空间 和 表空间的位置
    python 远程链接、搜索与下载
    python 读取 postgreSQL 数据保存CSV文件
    weka 初练之 文本分类
    基于springMVC+mybatis的实践记录
    简单的springMVC + mybatis 编写程序流程
    sql查询 生成列号
    通过资源文件 验证拦截机制
  • 原文地址:https://www.cnblogs.com/YY56/p/4830136.html
Copyright © 2011-2022 走看看