/* | f2 f1| * | 1 1 |^n 这样可以得到最终的结果 | f1 0 | | 1 0 | */ int climbStairs1(int n){ if(n<=2) return (n==1)?1:2; int f1=1,f2=2; m2by2 m=matrixPow(n-2); int res=m.m_00*f2+m.m_01*f1; return res; }
int climbStairs(int n) { if (n<2) return 1; int f2 = 1; int f1 = 1; Matrix22 f; f.v[0][0]=f.v[0][1]=f.v[1][0]=1; f.v[1][1]=0; Matrix22 r = matrixPow(f,n); return r.v[0][0]; }
m2by2 matrixPow(const int n) { assert(n>0); m2by2 m; if(n==1) m=m2by2(1,1,1,0); else if(n%2==0) { m=matrixPow(n/2); m=matrixMultiply(m,m); } else if(n%2==1) { m=matrixPow((n-1)/2); m=matrixMultiply(m,m); m=matrixMultiply(m,m2by2(1,1,1,0)); } return m; }