題解POJ 3233 (二分做法)

2021-07-28 23:23:22 字數 888 閱讀 9815

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...