poj 3233 矩陣快速冪

2021-06-23 00:13:42 字數 1554 閱讀 5954

十個利用矩陣乘法解決的經典題目的最後一題

1a終於刷完十道題了,基本都是乙個思路:二分優化!

a^1 + a^2 + a^3 + a^4 + a^5 + a^6 + a^7 + a^8  用二分變成 a^1 + a^2 + a^3 + a^4  + a^4 *( a^1 + a^2 + a^3 + a^4  )

a^1 + a^2 + a^3 + a^4 + a^5 + a^6 + a^7 + a^8 + a^9  用二分變成 a^1 + a^2 + a^3 + a^4  + a^4 *( a^1 + a^2 + a^3 + a^4  )+ a^9 

ac**如下:

#include #include #include #include using namespace std;

const int max_n = 33;

int mod, n, k;

void multipy( int a[max_n][max_n], int am, int an, int b[max_n][max_n], int bm, int bn, int c[max_n][max_n] )}}

}void add_matrix( int a[max_n][max_n], int b[max_n][max_n], int m, int n )

}}void get_matrix_pow( int a[max_n][max_n], int n );

int temp[max_n][max_n];

for( int i = 1; i <= n; i++ ) ans[i][i] = 1;

while( n )

multipy( a, n, n, a, n, n, temp );

memcpy( a, temp, sizeof( int ) * max_n * max_n );

n /= 2;

}memcpy( a, ans, sizeof( int ) * max_n * max_n );

}void solve( int a[max_n][max_n], int b[max_n][max_n], int n )

if( n == 0 )

}for( int i = 1; i <= n; i++ )

return;

}int temp1[max_n][max_n], temp2[max_n][max_n];

solve( a, b, n / 2 );

memcpy( temp1, b, sizeof( int ) * max_n * max_n );

get_matrix_pow( temp1, n / 2 );

multipy( temp1, n, n, a, n, n, temp2 );

add_matrix( a, temp2, n, n );

if( n & 1 )

}int main()

}solve( a, b, k );

for( int i = 1; i <= n; i++ )

printf( "\n" );}}

return 0;

}

poj3233(矩陣快速冪)

poj3233 給定n k,m 然後是n n行,我們先可以把式子轉化為遞推的,然後就可以用矩陣來加速計算了。矩陣是加速遞推計算的乙個好工具 我們可以看到,矩陣的每個元素都是乙個矩陣,其實這計算乙個分塊矩陣,我們可以把分塊矩陣展開,它的乘法和普通矩陣的乘法是一樣的。1 include 2 includ...

poj 3233 矩陣高速冪

題意 給出乙個公式求這個式子模m的解 分析 本題就是給的矩陣,所以非常顯然是矩陣高速冪,但有一點。本題k的值非常大。所以要用二分求和來降低執行時間。include include include include include include include include include incl...

POJ 3233 矩陣快速冪 二分

題意 給你乙個n n的矩陣 讓你求s 思路 只知道矩陣快速冪 然後nlogn遞推是會tle的。所以呢 要把那個n換成log 那這個怎麼搞呢 二分!當k為偶數時 當k為奇數時 就按照這麼搞就能搞出來了 我是看的題解才a的,中間亂搞的時候犯了一些腦殘的錯誤 by siriusren include in...