BNU 34974 MATLAB大法好
生活随笔
收集整理的這篇文章主要介紹了
BNU 34974 MATLAB大法好
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=34974
MATLAB大法好
?Time Limit:?8000ms Memory Limit:?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 1Sample 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大法好的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员:工作3年了,为啥越来越不值钱……
- 下一篇: 教你消灭 Java 代码的“坏味道”