BNU 34974 MATLAB大法好
阿新 • • 發佈:2017-06-16
output 內存泄露 轉置 輸出 查錯 ava 大小 2個 clear
分析:昨天比賽的時候寫了一下,超時了。
(AB)((AT).+1(BT).+1)
= [ A * ( (AT).+1)
]
題目鏈接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=34974
MATLAB大法好
8000ms 65536KB 64-bit integer IO format: %lld Java class name: MainMATLAB大法好。天滅C++,退C保平安,人在做,天在看,大段循環留禍患,內存泄露電腦滅,跳出遞歸保平安。
誠心誠念矩陣好,批量操作平安保,兩行代碼問題解,算法查錯有保障。
眾生都是碼農命,老板PUSH忘前緣。MATLAB弟子說真相。教你脫險莫拒絕。上網搜索九評Bjarne Stroustrup。有*真*相。
大家都知道,用MATLAB做矩陣計算是很方便的。
比方你想算矩陣A的轉置AT(即將A矩陣行列對調,元素aij變為aji),僅僅需敲A’ 就可以,而在C或C++中。你必須寫循環或者——什麽都不用做。再比方你想對A中的每一個元素都加1。在MATLAB中能夠輕松地寫作A.+1,而在C或C++中,你照樣要寫循環。
如今定義一個矩陣運算:
假設A是一個 m × n 的矩陣,而B是一個 p × q 的矩陣,那麽則是一個 mp × nq 的矩陣:
現給出矩陣A、B,求(AB)((AT).+1(BT).+1)。當中,前兩個括號之間表示正常的矩陣乘法,的運算優先級最低。
Input
第一行為數據組數t(t<=10)。
接下來。對每組數據:
第一行為4個整數m,n,p,q,1<=m,n,p,q<=50,分別代表矩陣A、B的行、列數。接下來為依照行列的2個矩陣A,B。矩陣元素為大小不超過100的非負整數。
Output
依照行列順序輸出結果矩陣。行內元素之間由空格隔開,行末無空格。
Sample Input
2 1 1 1 1 1 1 1 2 2 2 1 0 1 2 0 1
Sample Output
4 16 10 6 4
分析:昨天比賽的時候寫了一下,超時了。今天又看了一下,發現
(AB)((AT).+1(BT).+1)
= [ A * ( (AT).+1)
] [ B
* ( (BT).+1)]。這樣經過轉化就好寫了。
#include<stdio.h> #define N 55 #define M 2550 typedef long long LL; LL a[N][N], b[N][N], A[N][N], B[N][N]; LL ans[M][M]; int main() { int t, m, n, p, q, i, j; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&m,&n,&p,&q); for(i = 0; i < m; i++) for(j = 0; j < n; j++) scanf("%lld", &a[i][j]); for(i = 0; i < p; i++) for(j = 0; j < q; j++) scanf("%lld", &b[i][j]); for(i = 0; i < m; i++) for(j = 0; j < m; j++) { A[i][j] = 0; for(int x = 0; x < n; x++) A[i][j] += a[i][x] * (a[j][x] + 1); } for(i = 0; i < p; i++) for(j = 0; j < p; j++) { B[i][j] = 0; for(int x = 0; x < q; x++) B[i][j] += b[i][x] * (b[j][x]+1); } for(i = 0; i < m*p; i++) for(j = 0; j < m*p; j++) { int x = i / p; int y = j / p; int yy = j % p; int xx = i % p; ans[i][j] = A[x][y] * B[xx][yy]; } for(i = 0; i < m * p; i++) { for(j = 0; j < m*p - 1; j++) printf("%lld ",ans[i][j]); printf("%lld\n",ans[i][j]); } } return 0; }
BNU 34974 MATLAB大法好