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. 字符串切分 String.Split 和 Regex.Split

    当切割字符串的是单个字符时可使用String.Split string strSample="ProductID:20150215,Categroy:Food,Price:15.00&quo ...

  2. spring的@Transactional

    在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务.Spring默认情况下会对运行期例外(RunTimeExcept ...

  3. quartz集群分布式(并发)部署解决方案-Spring

    项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题, ...

  4. [No00007E]2016-面经[中]

    目录: 写一份动人简历的九个步奏 英文简历必备的十大元素 写一份动人简历的九个步骤 写一份动人的简历可以算得上是找工作最难的部分之一,但是,通过下面九步,这件事不再那么难了. 简历定位.雇主们之所以花 ...

  5. node-sass安装不成功的解决方案

    最近在学webpack,需要用到sass-loader加载器解析.scss文件,安装sass-loader,必须先安装node-sass,node-sass纠正了两天,用npm install nod ...

  6. node基础11:接受参数

    1.接收参数 在Node中接受GET/POST请求的参数不像PHP那样,在PHP中直接有全局变量$_GET,$_POST来接受url,或者请求体重的参数. 在node中接受GET参数使用url.par ...

  7. Linux下MySQL/MariaDB Galera集群搭建过程

    MariaDB介绍 MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证. MariaDB的目的是完全兼容MySQL,包 ...

  8. 【ASP.NET实战教程】基于ASP.NET技术下多用户博客系统全程实战开发(NNblog)

    岁末主推:牛牛老师主讲,多用户博客系统,基于ASP.NET技术,年后将带来移动业务平台项目项目目标: 打造个性品牌Blogo,定制多用户博客 为每一个博客用户提供个性化的 blogo解决方案,打造精品 ...

  9. .net ServiceStack.Redis 性能调优

    最近在debug生产环境的问题时,发现了ServiceStack 4.0.60版本RedisClient存在一个非常严重的性能问题.在高并发下,PooledRedisClientManager.Get ...

  10. 给大家分享一个jQuery TAB插件演示

    jquery tab选项卡插件示例页面代码,使用jquery.tabs.js轻量级的tab选项卡插件来实现,并支持鼠标滑过.点击.自动切换.数据回调等功能,有的是点击切换,有的是鼠标滑过切换,自带了多 ...