poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数。如果后四位全为0,则输出0,否则

输出后四位去掉前导0,也。。。就。。。是。。。说。。。输出Fn%10000。

题目说的如此清楚。。我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后

去掉前导0。o(╯□╰)o

还有矩阵快速幂的幂是0时要特判。

P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶!

#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 5

using namespace std;

const int mod = 10000;
int n,q;
struct Mat
{
    int mp[maxn][maxn];
    bool operator = (Mat a)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                mp[i][j] = a.mp[i][j];
        }
    }
};
Mat operator *(Mat a,Mat b)
{
    Mat c;
    memset(c.mp,0,sizeof(c.mp));
    for(int k=0;k<n;k++)
    {
        for(int i=0;i<n;i++)
        {
            if(a.mp[i][k]<=0) continue;
            for(int j=0;j<n;j++)
            {
                if(b.mp[k][j]<=0) continue;
                c.mp[i][j] = c.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%mod;
                if(c.mp[i][j]>mod) c.mp[i][j]-=mod;
            }
        }
    }
    return c;
}
Mat operator ^(Mat a,int k)
{
    Mat c;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            c.mp[i][j] = (i==j);
    }
    while(k)
    {
        if(k&1)
            c = c*a;
        a =a*a;
        k>>=1;
    }
    return c;
}
int main()
{
    while(scanf("%d",&q)!=EOF)
    {
        if(q == -1) break;
        Mat x;
        x.mp[0][0] = 0;
        x.mp[0][1] = 1;
        x.mp[1][0] = 1;
        x.mp[1][1] = 1;
        Mat y;
        y.mp[0][0] = 0;
        y.mp[1][0] = 1;
        Mat z;
        n = 2;
        if(!q)
        {
            printf("0\n");
            continue;
        }
        z = x^(q-1);
        Mat tmp = z*y;
        printf("%d\n",tmp.mp[1][0]%10000);
    }
    return 0;
}

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项),布布扣,bubuko.com

时间: 2024-12-21 21:57:10

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)的相关文章

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Appoint description:  System Crawler  (2015-02-28) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 +

矩阵快速幂求斐波那契

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int p=10000; 4 typedef long long ll; 5 int n,m; 6 7 struct node { 8 ll a[2][2]; 9 10 node operator*(const node &b) const { 11 node res; 12 for (int i = 0; i < 2; i++) { 13 for (int j =

POJ 3070 Fibonacci(矩阵快速幂)

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

c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)

写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include<stdio.h> int fibonacci(int n) { int num1=1, num2=1, num3=0,i; if (n <= 2) { printf("斐波拉契数列的第%d项为:%d\n",n,num1); } else { for (i = 2; i <

求斐波那契数列的相邻两项的比值,精确到小数后三位。

未完成,只能假设知道是9和10代入. 代码如下: package zuoye; import java.math.BigDecimal; /* * 求斐波那契数列的相邻两项的比值,精确到小数后三位. * p1,p2,p3......pi,pj,...求pi/pj * 1 1 2 3 5 8 13 * 5/8,8/13,...收敛 */ public class Test { static double feibo(int x){ if(x==1||x==2) return 1; return f

[板子]矩阵快速幂求解斐波那契

在斐波那契数列之中 f[i] = 1*f[i-1]+1*f[i-2]  f[i-1] = 1*f[i-1] + 0*f[i-2]; 即 所以 就这两幅图完美诠释了斐波那契数列如何用矩阵来实现. 摘自:http://blog.csdn.net/nyist_tc_lyq/article/details/52981353 #include<bits/stdc++.h> #define LL long long using namespace std; const long long pi=10000

求斐波那契数列的第n项值——9

写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 0            n = 0 F(n) =  1            n = 1 F(n-1)+F(n-2)    n > 1 也就是斐波那契数列为{0,1,1,2,3,5,8,13,21,......F(n-1)+F(n-2)}: 首先可以想到,因为要求第n个斐波那契数,就需要知道第n-1和第n-2个斐波那契数,而求第n-1个斐波那契数就需要知道第n-2个和第n-3个斐波那契数,第n-2个斐波

poj 3070 Fibonacci 矩阵快速幂

题目链接:http://poj.org/problem?id=3070 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 t

poj 3070 Fibonacci (矩阵快速幂乘/模板)

题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int N=2,M=2,P=2; const int MOD=10000; struct Matrix { ll m[N][N]; }; Matrix