一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
可知设a[n]
为n
级台阶的跳法,则a[n+1] = a[n] + a[n-1]
。
令
A=[1110]
有
[a[n+1]0a[n]0]=[a[n]0a[n−1]0]×A=[2010]×An−1
考虑快速幂,有
An=(A⌊2n⌋)2×An%2
故
[a[n+1]0a[n]0]=[2010]×(A⌊2n−1⌋)2×A(n−1)%2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class Solution { public: int base[4] = {1, 1, 1, 0}, a_n[4] = {1, 1, 1, 0}; void times(int a[4], int b[4]) { int r[4] = { a[0] * b[0] + a[1] * b[2], a[0] * b[1] + a[1] * b[3], a[2] * b[0] + a[3] * b[2], a[2] * b[1] + a[3] * b[3]}; a[0] = r[0]; a[1] = r[1]; a[2] = r[2]; a[3] = r[3]; } void cal_a(int n) { if (n > 1) { n -= 2; while (n) { if (n & 1) { times(a_n, base); } times(base, base); n >>= 1; } } } int jumpFloor(int n) { if (n == 1) { return 1; } if (n == 2) { return 2; } else { int m[4] = {2, 1, 0, 0}; cal_a(n - 1); times(m, a_n); return m[0]; } } };
|