2014 Multi-University Training Contest 9#6

时间:2023-01-15 12:23:43

2014 Multi-University Training Contest 9#6

Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 424    Accepted Submission(s): 219

Problem Description

One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learning something about matrix, so he decided to make a crazy problem for her.

Bob has a six-faced dice which has numbers 0, 1, 2, 3, 4 and 5 on each face. At first, he will choose a number N (4 <= N <= 1000), and for N times, he keeps throwing his dice for K times (2 <=K <= 6) and writes down its number on the top face to make an N*K matrix A, in which each element is not less than 0 and not greater than 5. Then he does similar thing again with a bit difference: he keeps throwing his dice for N times and each time repeat it for K times to write down a K*N matrix B, in which each element is not less than 0 and not greater than 5. With the two matrix A and B formed, Alice’s task is to perform the following 4-step calculation.

Step 1: Calculate a new N*N matrix C = A*B.
Step 2: Calculate M = C^(N*N). 
Step 3: For each element x in M, calculate x % 6. All the remainders form a new matrix M’.
Step 4: Calculate the sum of all the elements in M’.

Bob just made this problem for kidding but he sees Alice taking it serious, so he also wonders what the answer is. And then Bob turn to you for help because he is not good at math.

Input

The input contains several test cases. Each test case starts with two integer N and K, indicating the numbers N and K described above. Then N lines follow, and each line has K integers between 0 and 5, representing matrix A. Then K lines follow, and each line has N integers between 0 and 5, representing matrix B.

The end of input is indicated by N = K = 0.

Output

For each case, output the sum of all the elements in M’ in a line.

Sample Input

4 25 54 45 40 04 2 5 51 3 1 56 31 2 30 3 02 3 44 3 22 5 50 5 03 4 5 1 1 05 3 2 3 3 23 1 5 4 5 20 0

Sample Output

1456

问题:一开始的矩阵快速幂模板好像有点问题,改了之后还不对,原来是初始化的问题,又是没有初始化为0,导致加的时候出错。关键是它第一组是对的,后面就不对了,真实奇怪!

这一题思路还是很简单的,只是比赛的时候没去认真想。。。就去做其他题了。。。

(A*B)^1000*1000矩阵相乘,可以转化为A*(B*A)^(100*100-1)*B 运算次数减少很多,然后不要忘记是(1000*1000-1)

 #include <cstring>

 #include <iostream>

 #include <algorithm>

 #include <cstdio>

 #include <cmath>

 #include <map>

 #include <cstdlib>

 #define M(a,b) memset(a,b,sizeof(a))

 using namespace std;

 const int SMod = ;

 int N,K;

 struct Matrix

 {

     int m[][];

 };

 Matrix Mul(Matrix a,Matrix b,int mm,int kk,int nn)

 {

     Matrix c;

     memset(c.m,,sizeof(c.m));

     for(int i=;i<mm;i++)

         for(int j=;j<nn;j++)

             for(int k=;k<kk;k++)

                 c.m[i][j] += (a.m[i][k]*b.m[k][j])% SMod, c.m[i][j]%=;

     return c;

 }

 Matrix MPow(Matrix a,int n,int nn)

 {

     Matrix res;

     memset(res.m,,sizeof(res.m));

     for(int i = ;i<nn;i++)

         res.m[i][i] = ;

     while(n)

     {

         //cout<<n<<'!'<<endl;

         if(n&)

             res = Mul(res,a,nn,nn,nn);

         n>>=;

         a = Mul(a,a,nn,nn,nn);

     }

     return res;

 }

 int A[][],B[][],C[][],D[][];

 int main()

 {

    while(scanf("%d%d",&N,&K)==&&N+K!=)

    {

        Matrix M,te;

        M(M.m,);

        M(te.m,);

        M(A,);

        M(B,);

        M(C,);

        M(D,);

        for(int i = ;i<N;i++)

         for(int j = ;j<K;j++)

        {

            scanf("%d",&A[i][j]);

        }

        for(int i = ;i<K;i++)

         for(int j = ;j<N;j++)

        {

            scanf("%d",&B[i][j]);

        }

         for(int i=;i<K;i++)

         for(int j=;j<K;j++)

             for(int k=;k<N;k++)

                 M.m[i][j] += (B[i][k]*A[k][j])%SMod, M.m[i][j]%=SMod;

        int ans = ;

        te = MPow(M,N*N-,K);

         for(int i=;i<N;i++)

         for(int j=;j<K;j++)

             for(int k=;k<K;k++)

                 C[i][j] += ((A[i][k]*te.m[k][j])%SMod + SMod) % SMod;

         for(int i=;i<N;i++)

         for(int j=;j<N;j++)

             for(int k=;k<K;k++)

                 D[i][j] += ((C[i][k]*B[k][j])%SMod + SMod) % SMod;

        for(int i = ;i<N;i++)

          {for(int j = ;j<N;j++)

          {

              //cout<<D[i][j]%SMod<<' ';

              ans+=D[i][j]%SMod;

          }

            //cout<<endl;

          }

        printf("%d\n",ans);

    }

    return ;

 }

2014 Multi-University Training Contest 9#6的更多相关文章

  1. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  2. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. 2014 Multi-University Training Contest 9&num;11

    2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others)   ...

  4. 2014 Multi-University Training Contest 1&sol;HDU4861&lowbar;Couple doubi&lpar;数论&sol;法&rpar;

    解题报告 两人轮流取球,大的人赢,,, 贴官方题解,,,反正我看不懂.,,先留着理解 关于费马小定理 关于原根 找规律找到的,,,sad,,, 非常easy找到循环节为p-1,每个循环节中有一个非零的 ...

  5. 2014 Multi-University Training Contest 1&sol;HDU4864&lowbar;Task&lpar;贪心&rpar;

    解题报告 题意,有n个机器.m个任务. 每一个机器至多能完毕一个任务.对于每一个机器,有一个最大执行时间Ti和等级Li,对于每一个任务,也有一个执行时间Tj和等级Lj.仅仅有当Ti>=Tj且Li ...

  6. hdu 4937 2014 Multi-University Training Contest 7 1003

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

  7. hdu 4941 2014 Multi-University Training Contest 7 1007

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  8. hdu 4939 2014 Multi-University Training Contest 7 1005

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  9. hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...

随机推荐

  1. centos 7&period;0 编译安装php 5&period;6&period;7

    编译安装php参考资料 MySQL PHP API http://dev.mysql.com/doc/apis-php/en/index.html nginx + php +mysql 最简单安装 官 ...

  2. 5Hibernate配置及使用方法----青软S2SH&lpar;笔记&rpar;

    关于hibernate的简单配置,先看结构图,我们需要 1.还要弄一下需要的 jar包. 2.配置两个文件(hibernate配置文件和映射文件),不过映射文件可以用注解替代. 3.写一个pojo类, ...

  3. 【转】如何建立一个样式新颖的CSS3搜索框

    在线演示 搜索框大概是web开发中最常用的UI元素之一,我想基本没有必要去介绍如何使用它.无论是网站还是web应用,都会为了增强用户体验而添加它,那么你是不是也想过设计一个别致的搜索框? 在今天的文章 ...

  4. 身份验证cookies和Token

    后端服务器有两种基本的身份验证:1.是基于Cookie的身份验证,使用服务器端的cookie来对每次请求的用户进行身份验证.2. 较新的方法,基于令牌Token的认证,依赖于被发送到服务器上每个请求的 ...

  5. suse安装svn服务端和客户端的使用

    suse安装svn服务端 一. 安装服务端 配置网络安装源(suse11sp1为例) 新建11.1.repo11.1为软件源名称,可自定义文件并添加如下内容后保存 linux-e0xg:/etc/zy ...

  6. showMem&period;c setMem&period;c 及其改进

    #ifndef MEMUTIL_H_INCLUDED #define MEMUTIL_H_INCLUDED // Show memory void showMem(void *, unsigned); ...

  7. CSS规范 - 最佳实践--(来自网易)

    最佳选择器写法(模块) /* 这是某个模块 */ .m-nav{}/* 模块容器 */ .m-nav li,.m-nav a{}/* 先共性 优化组合 */ .m-nav li{}/* 后个性 语义化 ...

  8. Android Library开发注意事项

    Android Library开发注意事项 App Module添加依赖Android Library时可以设置library的优先级, 在编译时,app按照library从低到高的优先级依次与每个l ...

  9. &lbrack;py&rsqb;&lbrack;mx&rsqb;django实现课程机构排名

    如果是第一次做这个玩意,说实话,确实不知道怎么弄, 做一次后就有感觉了 此前我们已经完成了: 分类筛选 分页 这次我们做的是 课程机构排名 知识点: - 按照点击数从大到小排名, 取出前三名 hot_ ...

  10. JS学习-基础运动

    多物体运动 多个物体用同一个函数时,函数里定义的定时器应该要每个物体对应一个定时器名称,不然会导致未完成运动就被关闭了,因为定时器名称一样,而开启定时器前会清除一下. obj.timer 多值同时运动 ...