BNU 34974 MATLAB大法好

题目链接: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,求(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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值