poj 3233
題目大意:
給定三個數n,m,k。
下面n行每行n個數
給定乙個矩陣n*n的矩陣a
求s = a^1 + a ^2 +……+a^k答案對m取模
n的範圍30,k的範圍10^9,m的範圍10^4。
這道題我一看就知道要用等比的性質,但奈何我不會啊0 0,所以退而求次用二分來做了。
首先我們要用到矩陣快速冪。
然後怎麼求和呢
乙個小技巧
當k為偶數時
s=a^1+a^2+……+a^k=(a^1+a^2+…+a^(k/2))*(1+a^(k/2))
注意這裡的1指的是單位矩陣。
然後當k為奇數時只用加上乙個a^k就可以了
詳情見**
#include
#include
#include
#include
using
namespace
std;
int n, m, k;
struct mar;
mar a, res;
mar cheng( mar a, mar b )
return c;
}mar qpow( mar a, int k )
void work( int k )
work(k/2);
mar c = qpow(a, k/2);
for ( int i = 1; i <= n; i++ )
c.aa[i][i] ++;
res = cheng(res, c);
if (k % 2 != 0)
}int main()
ok結束 POJ 3233 矩陣快速冪 二分
題意 給你乙個n n的矩陣 讓你求s 思路 只知道矩陣快速冪 然後nlogn遞推是會tle的。所以呢 要把那個n換成log 那這個怎麼搞呢 二分!當k為偶數時 當k為奇數時 就按照這麼搞就能搞出來了 我是看的題解才a的,中間亂搞的時候犯了一些腦殘的錯誤 by siriusren include in...
poj3233經典二分矩陣快速冪
這個有個難點,就是他那個是到10的9次方,所以就是說,應該不能乙個乙個加,看了別人的方法就是用二分的方法,思路 這是一道典型的矩陣快速冪的問題。用到兩次二分,相當經典。矩陣快速冪。首先我們知道 a x 可以用矩陣快速冪求出來。其次可以對k進行二分,每次將規模減半,分k為奇偶兩種情況,如當k 10和k...
最長上公升子串行 二分做法
給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。輸入格式 第一行包含整數n。第二行包含n個整數,表示完整序列。輸出格式 輸出乙個整數,表示最大長度。資料範圍 1 n 10001 n 1000,109 數列中的數 109 109 數列中的數 109 輸入樣例 7 3 1 2 1 8...