1. 程式人生 > >poj 3233 矩陣乘法(分塊矩陣)

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 TreeDFS

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。   程式碼不是我寫的,我就按自己習慣改了下變數

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 SequenceAC自動機+矩陣快速冪

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