poj 3070 Fibonacci 矩阵基础题
来源:互联网 发布:spark windows 安装包 编辑:程序博客网 时间:2024/05/02 23:54
#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>#include <iostream>using namespace std;const int mod=10000;struct matrix{ int f[2][2];};matrix mul(matrix a,matrix b){ matrix c; memset(c.f,0,sizeof(c.f)); int i,j,k; for(k=0;k<2;k++) { for(i=0;i<2;i++) { if(!a.f[i][k])continue; for(j=0;j<2;j++) { if(!b.f[k][j])continue; c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod; } } } return c;}matrix pow_mod(matrix a,int b){ matrix s; memset(s.f,0,sizeof(s.f)); for(int i=0;i<2;i++) s.f[i][i]=1; while(b) { if(b&1) s=mul(s,a); a=mul(a,a); b=b>>1; } return s;}int main(){ int n; while(cin>>n) { if(n==-1)break; matrix e; e.f[0][0]=e.f[0][1]=e.f[1][0]=1;e.f[1][1]=0; e=pow_mod(e,n); cout<<e.f[0][1]<<endl; } return 0;}/* 矩阵基础题; |f[n] f[n-1]|*|1 1|=|f[n+1] f[n]| |1 0|*/