码迷,mamicode.com
首页 > 其他好文 > 详细

BNU 34974 MATLAB大法好

时间:2017-06-16 18:30:59      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:fine   print   center   分享   操作   lld   clear   c++   tla   

题目链接: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大法好

标签:fine   print   center   分享   操作   lld   clear   c++   tla   

原文地址:http://www.cnblogs.com/zhchoutai/p/7028696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!