矩阵快速幂,求模板。。。
最近学快速幂,一个人乱打乱撞。求调教~http://218.194.91.48/acmhome/problemdetail.do?&method=showdetail&id=1302
题目如上。
貌似是这样的: 1 1 1 1 f(n)
( 1 0 0 ) ^( n-3) * ( 1 ) = ( f(n-1) )
0 1 0 1 f(n-2)
大括号不会打,囧。
知道是要用矩阵快速幂,从网上搜了一些资料。第一次做这个,写了一段代码,好搓。
本人认真思考过,不是求作业。。。。。。只为提高。。。。。
这个到底是哪错了呢?求模板啊。
程序代码:
#include<iostream> #include<cstdio> using namespace std; struct Matrix{ __int64 map[3][3]; }; Matrix operator*(Matrix a,Matrix b) { int i,j,k; Matrix tmp; for(i=0;i<3;++i) for(j=0;j<3;++j){ __int64 all=0; for(k=0;k<3;++k){ all+=(a.map[i][k]%10000007)*(b.map[k][j]%10000007)%10000007; all%=10000007; } tmp.map[i][j]=all; } return tmp; } __int64 MatrixT(int p) { Matrix f,e,rt; int i,j; for(i=0;i<3;++i){ f.map[i][0]=1; for(j=0;j<3;++j){ e.map[i][j]=0; if(i==0||(i==1&&j==0)||(i==2&&j==1)) e.map[i][j]=1; if(i==j) rt.map[i][j]=1; } } if(p==1) rt=e*f; else{ while(p){ if(p&1) rt=rt*e; e=e*e; p>>=1; } rt=rt*f; } return rt.map[0][0]%10000007; } int main() { int n; while(~scanf("%d",&n)){ if(n==1||n==2||n==3) printf("1\n"); else printf("%I64d\n",MatrixT(n-3)); } return 0; }
[ 本帖最后由 cb_1212 于 2012-3-22 12:26 编辑 ]