• 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
    ",ans[i][j]);
            }
        }
        return 0;
    }


  • 相关阅读:
    Python爬虫框架Scrapy
    继承
    c/c++面试题(7)零碎知识总结
    Linux网络编程(多人在线聊天系统)
    第一章 计算机系统漫游
    Linux网络编程(简单的时间获取服务器)
    虚函数(1)
    c/c++面试题(9)linux方向
    Linux网络编程的一般步骤(1)
    进程/线程介绍
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7028696.html
Copyright © 2020-2023  润新知