题意:
输入k,求斐波那契数列的第k个数 mod 10000 f(n)=f(n-1)+f(n-2)
斐波那契数列 0,1,1,2,3,5,8.....n
题解:
关键点1:
d [ 1 1 ] * e [ A ] = e [ A+B ]
[ 1 0 ] [ B ] [ A ]
关键点2:
2^11 = (2^4)(2^2)(2^1) 这样可以加快计算 幂 原本要循环11次,现在只用3次
关键点3:
二进制 >>: 右移一位 || &1 :个位是否为1
根据d矩阵的特性 和 e单位矩阵 结合
d [ 1 1 ] e [ 1 0 ]
[ 1 0 ] [ 0 1 ]
e=d * e'
d= d * d ;
#include
#include
#include
using namespace std;
const int mod=10000;
const int N=2;
struct mat{
//矩阵
int n,at[N][N];
mat(int n=0){
this->n=n;
memset(at,0,sizeof(at));
}
mat operator *(mat b){
mat tmp=mat(n);
for(int i=0;i>=1;//先右移一位,再赋值给k
}
return e;
}
int main()
{
mat d;//初始化 {{1,1},{1,0}}矩阵
d.at[0][0]=1;d.at[0][1]=1;d.at[1][0]=1;
d.at[1][1]=0;
int k;
while(~scanf("%d%",&k) && k!=-1){
mat ret=sol(d,k);
int ans=ret.at[0][1]%mod;
printf("%d\n",ans);
}
return 0;
}