Fibonacci[矩阵乘法]

题目描述

Fibonacci数列定义如下

f[i]=f[i-2]+f[i-1]  i>2

1          i=2

1          i=1

请你求Fibonacci数列的第n项

输入

一个整数 n (1<=n<=231-1)

输出

一个整数Fibonacci数列的第n项mod 32768的值

提示

代码

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=(j);i<=(k);++i)
#define per(i,j,k) for(register int i=(j);i>=(k);--i)
using namespace std;
template<class T> inline void read(T &x)
{
    x=0;
    register char c=getchar();
    register bool f=0;
    while(!isdigit(c))f^=c=='-',c=getchar();
    while(isdigit(c))x=x*10+c-'0',c=getchar();
    if(f)x=-x;
}
#define mod 32768
int n;
struct matrix{
    int a[11][11];
    inline matrix()
    {
        memset(a,0,sizeof(a));
    }
    inline matrix operator *(const matrix &b) const
    {
        matrix res;
        rep(i,1,2)
            rep(j,1,2)
                rep(k,1,2)
                    res.a[i][j]=(res.a[i][j]+a[i][k]*b.a[k][j])%mod;
        return res;
    }
}ans,base;
inline void quickpow(register int k)
{
    while(k)
    {
        if(k&1) ans=ans*base;
        base=base*base;
        k>>=1;
    }
}
int main()
{
    read(n);
    if(n<=2)
        return puts("1"),0;
    base.a[1][1]=base.a[1][2]=base.a[2][1]=1;
    ans.a[1][1]=ans.a[1][2]=1;
    quickpow(n-2);
    printf("%d",ans.a[1][1]%mod);
    return 0;
}
posted @ 2020-05-02 11:59  牛大了的牛大  阅读(240)  评论(0编辑  收藏  举报