HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】

难度上,,,确实,,,不算难

问题是有个矩阵运算的优化

题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起来乘为C矩阵,然后算C^(N*N)

相当于

ABABABABABABAB...=(AB)^(N*N)

不如

A(BA)^(N*N-1)B

因为BA乘得K*K的矩阵,K是比较小的

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
int a[1111][1111];
int b[1111][1111];
int c[1111][1111];
int tmp[1111][1111];
int sum[1111][1111];
void TIMES(int K,int N,int M,int aa[][1111],int bb[][1111],int cc[][1111]){
	memset(tmp,0,sizeof(tmp));
	for(int i=1;i<=K;i++){
		for(int j=1;j<=M;j++){
			for(int k=1;k<=N;k++){
				tmp[i][j]=(tmp[i][j]+aa[i][k]*bb[k][j]%6)%6;
			}
		}
	}
	for(int i=1;i<=K;i++)
		for(int j=1;j<=M;j++)
			cc[i][j]=tmp[i][j]%6;
}
void quick(int cc[][1111],int mi,int n){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i==j) sum[i][j]=1;
			else sum[i][j]=0;
	while(mi){
		if(mi&1)
			TIMES(n,n,n,cc,sum,sum);
		TIMES(n,n,n,cc,cc,cc);
		mi>>=1;
	}
}
int main(){
#ifndef ONLINE_JUDGE
	freopen("G:/in.txt","r",stdin);
	//freopen("G:/myout.txt","w",stdout);
#endif
	int N,K;
	while(~scanf("%d%d",&N,&K)){
		if(N==0 && K==0) return 0;
		for(int i=1;i<=N;i++){
			for(int j=1;j<=K;j++){
				scanf("%d",&a[i][j]);
			}
		}
		for(int i=1;i<=K;i++){
			for(int j=1;j<=N;j++){
				scanf("%d",&b[i][j]);
			}
		}
		TIMES(K,N,K,b,a,c);
		quick(c,N*N-1,K);
		TIMES(N,K,K,a,sum,sum);
		TIMES(N,K,N,sum,b,sum);
		int ans=0;
		for(int i=1;i<=N;i++)
			for(int j=1;j<=N;j++)
				ans+=sum[i][j];
		cout<<ans<<endl;
	}
}

HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】,布布扣,bubuko.com

时间: 2024-08-02 02:45:40

HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】的相关文章

【杂题总汇】HDU多校赛第十场 Videos

[HDU2018多校赛第十场]Videos 最后一场比赛也结束了-- +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和看了这部电影会得到的快乐值.电影分成两种类型,若同一个人连续(不是时间连续,是顺序连续)看了两部相同类型的电影,他的快乐值会扣除W,数据保证扣除的值不超过电影增加的快乐值. 特别的,一个人换电影不花费时间,即若第一部电影的结束时间等于下一部电影的开始时间,是可以两场都看的:看电影必须看完:一部电影只能一个人看

【多校赛第三场】Redraw Beautiful Drawings【网络流】【谜のWA】

参考题解:http://blog.csdn.net/qian99/article/details/38276887 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <queue> #include <vector> #include <algorithm>

2015 多校赛 第五场 1010 (hdu 5352)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 看题看得心好累. 题目大意: 给出 n 个点,依次执行 m 次操作:输入“1 x”时,表示将与 x 连通的点全部修复:输入“2 x y”,表示在 x 与 y 之间加一条边:输入“3 x y”,表示删除 x 与 y 之间的边.题目确保不会与重边并且操作合法. 题目会给出 k,要求每次修复的的点的数目小于等于k. 问:怎样执行操作1,使得令修复点数最多的同时,令每次执行操作1所修复的点的数目所构成

hdu 5328 Problem Killer(杭电多校赛第四场)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328 题目大意:找到连续的最长的等差数列or等比数列. 解题思路:1.等差等比的性质有很多.其中比较重要的一个就是解题关键:如a[i-2],a[i-1],a[i],a[i+1]这个序列.a[i-2],a[i-1],a[i]是等差数列,a[i-1],a[i],a[i+1]也是等差数列.那么a[i-2],a[i-1],a[i],a[i+1]就是等差数列.  2. 等比数列也是一样的~~只要根据这个性质就

hdu 5326 Work(杭电多校赛第三场)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5326 Work Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 583    Accepted Submission(s): 392 Problem Description It’s an interesting experience to

2015 多校赛 第五场 1009 (hdu 5348)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题目大意:给出一幅无向图,问是否存在一种方案,使得给每条边赋予方向后,每个点的入度与出度之差小于等于1.如不存在,输出-1:存在,则按边的输入顺序输出方向. 比如:若给出第 m 条边为 u,v,则在对应第m行输出0表示u->v,输出1表示u<-v. 解题思路: 首先证明一定可以构造出符合要求的图. 对于一个环,显然可以使得其内的每个点入度与出度相等.之后可以把环看成点. 对于一棵树,则可以通

2015 多校赛 第四场 1010 (hdu 5336)

Problem Description XYZ is playing an interesting game called "drops". It is played on a r∗c grid. Each grid cell is either empty, or occupied by a waterdrop. Each waterdrop has a property "size". The waterdrop cracks when its size is

2015 多校赛 第四场 1009 (hdu 5335)

Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit). In every position of this maze, there is either a 0 or a 1 written on it. An explorer gets lost in this grid. His position now is (1,1), and he want

hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)暨2015暑期多校赛第10场

题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结果(mod 1e9+7). 感觉蛮变态的,从比赛开始我就是写的这道题,比赛结束还是没写出来…… 期间找到了逆元,最小公倍数,组合数的各种公式,但是爆了一下午tle. 比赛结束,题解告诉我,公式秒杀法…… 但是公式看不懂,幸好有群巨解说,所以有些听懂了,但还是需要继续思考才能弄懂. 题解: 设ans[i]表示i