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; }