POJ3070:Fibonacci——题解

http://poj.org/problem?id=3070

题目大意:求Fibonacci数列第n项,对10000取模。

矩阵乘法板子题……实在不知道写什么了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
ll n,m=10000;
struct node{
    ll g[4][4];
}f,res;
void buildI(node &x){//构造单位矩阵
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            if(i==j)x.g[i][j]=1LL;
            else x.g[i][j]=0LL;
        }
    }
    return;
}
void multi(node &x,node &y,node &z){//z=x*y
    memset(z.g,0,sizeof(z.g));
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            if(x.g[i][j]){
                for(int k=1;k<=2;k++){
                    z.g[i][k]+=x.g[i][j]%m*y.g[j][k]%m;
                    z.g[i][k]%=m;
                }
            }
        }
    }
    return;
}
void qpow(ll k){
    buildI(res);
    node tmp=f,t;
    while(k!=0){
        if(k&1){
            multi(res,tmp,t);
            res=t;
        }
        multi(tmp,tmp,t);
        tmp=t;
        k>>=1;
    }
    return;
}
ll solve(){
    if(n==0)return 0LL;
    if(n<=2)return 1LL;
    qpow(n-2);
    ll ret=res.g[1][1]%m+res.g[2][1]%m;
    return ret%m;
}
int main(){
    while(scanf("%lld",&n)!=EOF){
        if(n==-1)break;
        f.g[1][1]=1;f.g[1][2]=1;
        f.g[2][1]=1;f.g[2][2]=0;
        ll res=solve();
        printf("%lld\n",res);
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

原文地址:https://www.cnblogs.com/luyouqi233/p/8387233.html

时间: 2024-11-02 15:34:28

POJ3070:Fibonacci——题解的相关文章

矩阵十题【六】 poj3070 Fibonacci

题目链接:http://poj.org/problem?id=3070 题目大意:给定n和10000,求第n个Fibonacci数mod 10000 的值,n不超过2^31.结果保留四位数字. 很简单的题,和之前做过的相比简单很多了. 构造最简单的斐波那契数列矩阵. #include<iostream> #include<cstring> #include<stdio.h> using namespace std; const int MAX = 2; struct M

POJ3070 Fibonacci【矩阵快速幂】

Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20098 Accepted: 13850 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 a

POJ3070 Fibonacci(矩阵快速幂)

用矩阵快速幂求fibonacci序列的第n项. /* *********************************************** Author :devil Created Time :2016/1/19 20:11:43 ************************************************ */ #include <iostream> #include <algorithm> #include <cstring> #in

矩阵乘法 POJ3070 Fibonacci

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15215   Accepted: 10687 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 sequen

[POJ3070] Fibonacci|矩阵乘法

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11024   Accepted: 7846 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 sequenc

poj3070 Fibonacci

题意:求第n项斐波那契数的后四位 即mod10000: 分析:题意给了方法,用1 1 1 0矩阵的n次幂,就牵扯到了一个矩阵的快速幂模板. 代码: #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include

POJ3070:Fibonacci(矩阵快速幂模板题)

http://poj.org/problem?id=3070 #include <iostream> #include <string.h> #include <stdlib.h> #include <cstdio> #include <algorithm> #define mod 10000 using namespace std; struct m { int a[3][3]; } init,res; int n; m Mult(m x,m

POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】

题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #include <iostream> #include <cstring> using namespace std; const int MOD = 10000; void mul(int f[2], int base[2][2]) { int c[2]; memset(c, 0, sizeof

【CF914G】Sum the Fibonacci 快速??变换模板

[CF914G]Sum the Fibonacci 题解:给你一个长度为n的数组s.定义五元组(a,b,c,d,e)是合法的当且仅当: 1. $1\le a,b,c,d,e\le n$2. $(s_a|s_b) \& s_c \& (s_d $^$ s_e)=2^i$,i是某个整数3. $s_a \& s_b=0$ 求$\sum f(s_a|s_b) * f(s_c) * f(s_d $^$ s_e)$,f是斐波那契数列,对于所有合法的五元组(a,b,c,d,e).答案模$10^9