1. 程式人生 > >BNU 34974 MATLAB大法好

BNU 34974 MATLAB大法好

output 內存泄露 轉置 輸出 查錯 ava 大小 2個 clear

題目鏈接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=34974

MATLAB大法好

8000ms 65536KB 64-bit integer IO format: %lld Java class name: Main

MATLAB大法好。天滅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,求(A技術分享B)((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

分析:昨天比賽的時候寫了一下,超時了。

今天又看了一下,發現

(A技術分享B)((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大法好