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#11

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

  4. 2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/法)

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

  5. 2014 Multi-University Training Contest 1/HDU4864_Task(贪心)

    解题报告 题意,有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. makefile 学习笔记

    1/ 编写简单makefile test_out: test.o g++ test.o -o test_out test.o: test.cpp test.h g++ -c test.cpp test ...

  2. 一份关于Swift语言学习资源的整理文件

    一份关于Swift语言学习资源的整理文件     周银辉 在这里下载 https://github.com/ipader/SwiftGuide

  3. maven中央仓库访问速度太慢的解决办法

    方法一:修改settings.xml eclipse中集成的maven的settings.xml文件,找了半年也没找到,我们放弃eclipse中的maven,下一个最新的maven,并在eclipse ...

  4. jquery中attr()与prop()区别

    我们知道jquery中获取元素属性有两种常见的方法,一个是attr()方法,这个是用的比较多的,也是我们第一个想到的.另外一个就是prop()方法了,这个方法之前很少用到,它是jquery1.6之后新 ...

  5. JavaScript indexOf() 方法 和 lastIndexOf() 方法

    indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索. 语法: in ...

  6. 重构alert,confirm

    最近写了一个重构的alert,confirm控件,调用时直接使用alert,confirm即可 //调用方法 alert("提示语") window.confirm('你确定要删除 ...

  7. EF批量添加数据性能慢的问题的解决方案

    //EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...

  8. linux进阶1

    1.linux命令 1.1.find功能:在linux文件系统中,用来查找一个文件放在哪里了.举例:find /etc -name "interfaces"总结:(1)什么时候用f ...

  9. I finally made sense of front end build tools. You can, too.

    来源于:https://medium.freecodecamp.com/making-sense-of-front-end-build-tools-3a1b3a87043b#.nvnd2vsd8   ...

  10. JDK历史版本

    http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html