求數a
aa的n
nn次冪,可以採用二分法進行快速計算,即
a n=
a^}\cdot a^}, & n為偶數\\ a\cdot a^}\cdot a^}, & n為奇數 \end\right.
an=a^n&=a^\\ &=a^\\ &=a^\cdot a^\cdot a^\cdot a^\cdots a^\\ &=a^\cdot (a\cdot a)^\cdot (a^2\cdot a^2)^\cdot (a^4\cdot a^4)^\cdots (a^}\cdot a^})^\end
an=a(
b0b
1b2
b3
⋯bk
)2=
ab0
20+b
121
+b2
22+b
323
+⋯bk
2k=
a1b0
⋅a2
b1⋅
a4b2
⋅a8
b3⋯
abk
2k=a
b0⋅
(a⋅a
)b1
⋅(a2
⋅a2)
b2⋅
(a4⋅
a4)b
3⋯(
a2k−
1⋅a2
k−1)
bk
public
intpower
(int a,
int n)
n /=2;
// 還可以用 n = n >> 1,表示二進位制右移一位
a *= a;
// 迭代計算下一位的基數
}return result;
}
和上述思路完全一樣,只是全部對於矩陣乘法。斐波那契數列定義如下
f (n
)=
0, & n=0\\ 1, & n=1\\ f(n-2)+f(n-1), & n\ge2 \end\right.
f(n)=⎩
⎨⎧0
,1,f
(n−2
)+f(
n−1)
,n=
0n=1
n≥2
可以構造矩陣a=[
1110
]a=\left[\begin1 \quad 1\\ 1 \quad 0\end\right]
a=[111
0],則[f(
n+1)
f(n)
f(n)
f(n−
1)]=
an
\left[\beginf(n+1) \quad f(n)\\ f(n) \quad f(n-1)\end\right]=a^n
[f(n+1
)f(n
)f(n
)f(n
−1)
]=an
。其中a
na^n
an就可以使用矩陣快速冪計算。
public
class
fibonacci
r[i]
[j]= tmp;}}
return r;
}static
intfibonacci
(int n),}
;int
a =
newint
,};while
(n >0)
n /=2;
a =dot(a, a);}
return result[0]
[0];
}public
static
void
main
(string[
] args)
}
矩陣快速冪(求斐波那契數列)
矩陣快速冪求斐波那契數列的模板 因為fib n 至於最近的倆個序列有關 及fib n 1 和fib n 2 所以我們儲存最近的那倆個就行了。設f n 表示乙個1 2的矩陣,f n fib n fib n 1 可以看成 a,b a b,b 所以可以變成f n f n 1 a a表示乙個二維矩陣 a 2...
矩陣快速冪 斐波那契數列
time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...
矩陣快速冪 斐波那契數列
先來實現乙個矩陣相乘的函式吧。const int mod 10000 struct mat mat mat mul mat x,mat y 實現兩個矩陣相乘,返回的還是乙個矩陣。return res 其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪 int pow int...