poj 3233 矩陣乘法(分塊矩陣)
題解:Sn為所求矩陣, 則
這樣, 此題就變成了求矩陣冪和矩陣乘法, 分塊矩陣乘法和普通矩陣一樣的。
code:
/* adrui's submission Language : C++ Result : Accepted Love : ll Favorite : Dragon Balls Standing in the Hall of Fame */ #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<iostream> #include<bitset> #include<map> using namespace std; #define M(a, b) memset(a, b, sizeof(a)) #define mid ((l + r) >> 1) #define ls rt << 1, l, mid #define rs rt << 1|1, mid + 1, r #define lowbit(x) (x & (-x)) #define LL long long #define REP(n) for(int i = 0; i < n; i++) #define debug 0 #define mod 1000 int n, k, m; struct Matrix { int mat[65][65]; //分塊矩陣原因, size要是2倍 void init() { //單位矩陣 M(mat, 0); for (int i = 0; i < 65; i++) mat[i][i] = 1; } void output(int c) { for (int i = 0; i < c; i++) { for (int j = 0; j < c; j++) { printf("%d%s", mat[i][j] % m, j != c - 1 ? " " : "\n"); } } } }; Matrix operator * (Matrix a, Matrix b) { //矩陣乘法 Matrix c; M(c.mat, 0); for (int i = 0; i < 2 * n; i++) { for (int j = 0; j < 2 * n; j++) { for (int k = 0; k < 2 * n; k++) c.mat[i][j] += (a.mat[i][k] * b.mat[k][j]) % m; c.mat[i][j] %= m; } } return c; } Matrix operator + (const Matrix &a, const Matrix &b) { //矩陣加法 Matrix c; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { c.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % m; } } //c.output(); return c; } Matrix Matrix_fast_mod(Matrix tmp, int b) { //快速矩陣冪 Matrix res; res.init(); //單位矩陣 while (b) { if (b & 1) res = tmp * res; tmp = tmp * tmp; b >>= 1; } return res; } int main() { #if debug freopen("in.txt", "r", stdin); #endif //debug while (~scanf("%d%d%d", &n, &k, &m)) { Matrix ans, b; M(b.mat, 0); Matrix res; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &res.mat[i][j]); res.mat[i][j] %= m; b.mat[i][j] = res.mat[i][j]; //b是冪底數矩陣 res.mat[i][n + j] = res.mat[i][j]; //ret是包含Sn的分塊矩陣 } b.mat[n + i][i] = b.mat[n + i][n + i] = 1; } //b.output(2 * n); b = Matrix_fast_mod(b, k - 1); //矩陣冪 //b.output(2*n); //res.output(2 * n); ans = res * b; ans.output(n); //輸出 } return 0; }
相關推薦
poj 3233 矩陣乘法(分塊矩陣)
題解:Sn為所求矩陣, 則 這樣, 此題就變成了求矩陣冪和矩陣乘法, 分塊矩陣乘法和普通矩陣一樣的。 code: /* adrui's submission Language : C++ Result : Accepted Love : ll Favorite
牛客國慶集訓派對Day2 A 矩陣乘法(思維分塊)
題目連結 題意: 給你兩個矩陣A,B, A是n*p,B是p*m,B是一個只有0,1組成的矩陣,Aij<65536 C=A*B,讓你求出C的裡面所有元素的異或和 解析: 官方的標解是分塊,每8個分一組。 例如對於A,每行行每8個分成一組,對於B,
矩陣基礎 (3). 分塊矩陣的加法和乘法運算
摘要 本文主要講述分塊矩陣的加法運算和乘法運算。將矩陣進行分塊操作有很多的好處,特別是在高效能平行計算領域內,矩陣的分塊化操作更是有很多益處。 1. 分塊矩陣加法運算 給定矩陣A,B分別如下, 矩陣A+B=C,矩陣C如下, 分塊矩陣的加法運算非常顯然,這裡就不再多費
牛客國慶集訓派對Day2 A 矩陣乘法(思維分塊)
題目連結 題意: 給你兩個矩陣A,B, A是n*p,B是p*m,B是一個只有0,1組成的矩陣,Aij<65536 C=A*B,讓你求出C的裡面所有元素的異或和 解析: 官方的標解是分塊,每8個分一組。 例如對於A,每行行每8個分成一組,對於B,每一列每
python中@符號兩種含義,1表示修飾符,2表示矩陣乘法(python3.5以後)
第一種,大家所熟知,表示修飾符,可以在模組或者類的定義層內對函式進行修飾。出現在函式定義的前一行,不允許和函式定義在同一行。在下面這種情況 def funcA(A): print("function A") print(A) def funcB(B): print(B(
hdu4417(分塊+二分)
題目: 給n個數,數中有重複的。有m個詢問,問的是[L,R] 區間內有多少個數小於等於h。 分析: 快速查詢——排序(快排),二分 注意: 二分邊界 #include<bits/stdc++.h> #define maxn 100010 using namespace
luogu2801教主的魔法(分塊+二分)
洛谷P2801 題目: 教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給XMYZ資訊組每個英雄看。於是N個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1、2、……、N。 每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間[L, R](1≤L
HTTP 斷點續傳(分塊傳輸)
簡述 斷點續傳:指的是在上傳/下載時,將任務(一個檔案或壓縮包)人為的劃分為幾個部分,每一個部分採用一個執行緒進行上傳/下載,如果碰到網路故障,可以從已經上傳/下載的部分開始繼續上傳/下載未完成的部分,而沒有必要從頭開始上傳/下載。可以節省時間,提高速度。
Codeforces 1017G The Tree(分塊DFS)
Codeforces 1017G The Tree 題目大意: 給一個一開始所有節點都是白色的樹,給一些查詢操作,給的三種操作: 1.在v的所有子節點中向下深搜,直到找到第一個白色子孫節點(或者自己),染成黑色。 2.把v的所有子樹(包括它自己)全部
1057 Stack (分塊思想)
out esp col file nts return while com eve Stack is one of the most fundamental data structures, which is based on the principle of Last I
poj 3233 Matrix Power Series (構造分塊矩陣)
題目連結:哆啦A夢傳送門 題意:自己看。 參考部落格:神犇 題解:分塊矩陣:分塊矩陣可以構造求和。 例如:我們可以這樣構造, 還需注意一點的是:算完S(k+1),取出右上角矩陣分塊後,還需減掉單位矩陣E。 程式碼不是我寫的,我就按自己習慣改了下變數
轉置矩陣的分塊並行乘法(C語言實現),計算矩陣C[rawn][rawn]=A[rawm][rawn]'*B[rawm][rawn],子塊大小為S*T,其演算法實現原理參加本程式碼的附件。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define rawm 4 #define rawn 4 #defi
POJ 3233 Matrix Power Series(求矩陣冪的和——分塊矩陣快速冪 or 二分遞迴+矩陣快速冪)
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 21451 Accepted:
程式效能優化探討(6)——矩陣乘法優化之分塊矩陣
有一種性格叫做偏執,有一種矩陣優化運算叫做分塊。實話說,也許我這輩子也用不上這種隨牛B但很複雜的演算法,有些版本的教材直接刪除這個內容。但越是這樣我越想不過,因此借寫這篇部落格,把分塊矩陣乘法徹底分析清楚。 把矩陣乘法進行分塊優化,
HDU-6395多校7 Sequence(除法分塊+矩陣快速冪)
review lse %d sca code left define hdu fin Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others
暴力分塊矩陣乘法
題引 題解 樸素的演算法 O(4096 * 64 * 4096) = O(1e9) 不用想是超時的。 因為每次矩陣乘法中存在很多重複的計算。 考慮將矩陣進行分塊優化。預處理出每塊的值。 怎麼分塊。考慮對A矩陣的列分塊,和B矩陣的行分塊。因為p是公共的邊,
【洛谷 P5110】 塊速遞推(矩陣加速,分塊打表)
題目連結 掌握了分塊打表法了。原來以前一直想錯了。。。 塊的大小\(size=\sqrt n\),每隔\(size\)個數打一個表,還要在\(0\text{~}size-1\)每個數打一個表。 然後就可以做到\(O(1)\)查詢了。 比如要求\(A^{n}\),只需要算出\(biao[n/size]*pow
poj 3744 Scout YYF I (矩陣乘法+概率與期望DP)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8237 Accepted: 2428 Des
POJ 2778 DNA Sequence(AC自動機+矩陣快速冪)
ace str etc cto .org empty pan dac http http://poj.org/problem?id=2778 題意:給出一些病毒字符串,只由A,T,C,G組成,現在要用著4個字符組成長度為n的字符串,且字符串中不可以包含任一病毒字符串,問共
cuda編程-矩陣乘法(1)
return mac cpu ims iostream oba 簡單的 oid memory 本方法采用簡單的單線程計算每組行和列乘加運算 代碼如下: #include <stdio.h> #include <stdlib.h> #include