题目1474:矩阵幂

题目描述:

给定一个n*n的矩阵,求该矩阵的k次幂,即P^k。

输入:

输入包含多组测试数据。
数据的第一行为一个整数T(0<T<=10),表示要求矩阵的个数。
接下来有T组测试数据,每组数据格式如下: 
第一行:两个整数n(2<=n<=10)、k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示。
接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10)。另外,数据保证最后结果不会超过10^8。

输出:

对于每组测试数据,输出其结果。格式为:
n行n列个整数,每行数之间用空格隔开,注意,每行最后一个数后面不应该有多余的空格。

样例输入:
3
2 2
9 8
9 3
3 3
4 8 4
9 3 0
3 5 7
5 2
4 0 3 0 1
0 0 5 8 5
8 9 8 5 3
9 6 1 7 8
7 2 5 7 3
样例输出:
153 96
108 81
1216 1248 708
1089 927 504
1161 1151 739
47 29 41 22 16
147 103 73 116 94
162 108 153 168 126
163 67 112 158 122
152 93 93 111 97

 1 #include<iostream>
 2 using namespace std;
 3 //for i=0 to n-1
 4 //    for j=0 to n-1
 5 //     for k
 6 //c[i][j]=sum(b[i][0 to n-1]*a[0 to n-1][j])
 7 struct shenme
 8 {
 9     int m[10][10];
10 };
11 struct shenme arry[10];
12 struct shenme multiply(struct shenme a,struct shenme b, int  n)
13 {
14     struct shenme c;
15     for(int i=0;i<n;i++)
16     {
17         for(int j=0;j<n;j++)
18         {
19             c.m[i][j]=0;
20             for(int k=0;k<n;k++)
21             {
22                 c.m[i][j]+=a.m[i][k]*b.m[k][j];
23
24             }
25
26         }
27
28     }
29 return c;
30
31 }
32 void inite(int n,int t)
33 {
34     for(int i=0;i<n;i++)
35         for(int j=0;j<n;j++)
36         {
37             cin>>arry[t].m[i][j];
38         }
39 }
40 struct shenme jiecheng(int k,int t,int n)
41 {
42     struct shenme temp;
43     for(int i=0;i<n;i++)
44         for(int j=0;j<n;j++)
45             temp.m[i][j]=arry[t].m[i][j];
46     for(int i=2;i<=k;i++)
47     {
48         temp=multiply(arry[t],temp,n);//传入两个结构体
49     }
50     return temp;
51 }
52 void out(struct shenme result,int n)
53 {
54     for(int i=0;i<n;i++)
55     {
56         for(int j=0;j<n;j++)
57         {
58             if(j!=n-1)
59                 cout<<result.m[i][j]<<" ";
60             else
61                 cout<<result.m[i][j];
62         }
63         cout<<endl;
64     }
65 }
66 int main()
67 {
68     int T;//输入几个数组?(结构体)
69     cin>>T;
70     for(int t=0;t<T;t++)//t第几个数组
71     {
72         int n,k;
73         cin>>n>>k;
74         //数组初始化
75         inite(n,t);
76         struct shenme result;
77         result=jiecheng(k,t,n);
78         out(result,n);
79     }
80     return 0;
81 }
时间: 2024-10-04 16:12:45

题目1474:矩阵幂的相关文章

九度OJ 1474 矩阵幂(高效算法)

题目1474:矩阵幂 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2864 解决:1112 题目描述: 给定一个n*n的矩阵,求该矩阵的k次幂,即P^k. 输入: 输入包含多组测试数据. 数据的第一行为一个整数T(0<T<=10),表示要求矩阵的个数. 接下来有T组测试数据,每组数据格式如下: 第一行:两个整数n(2<=n<=10).k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示. 接下来有n行,每行n个正整数,其中,第i行第j个整数表示

Poj 3233 矩阵快速幂,暑假训练专题中的某一道题目,矩阵快速幂的模板

题目链接  请猛戳~ Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m <

矩阵幂 (调试费了好大力气)

每天进步一点点...... 题目描述 给定一个n*n的矩阵,求该矩阵的k次幂,即P^k. 输入描述: 输入包含多组测试数据.数据的第一行为一个整数T(0<T<=10),表示要求矩阵的个数.接下来有T组测试数据,每组数据格式如下: 第一行:两个整数n(2<=n<=10).k(1<=k<=5),两个数字之间用一个空格隔开,含义如上所示.接下来有n行,每行n个正整数,其中,第i行第j个整数表示矩阵中第i行第j列的矩阵元素Pij且(0<=Pij<=10).另外,数据

[ACM] POJ 3070 Fibonacci (矩阵幂运算)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9517   Accepted: 6767 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence

快速矩阵幂+DFS构造矩阵+大数 ACdream1214 Nice Patterns Strike Back

传送门:点击打开链接 题意:告诉你矩阵大小是n*m,要求矩阵中不能有2*2的白色子矩阵或者黑色子矩阵,最后种类数模P 思路:如果不是大数,这道题还是非常有意思的..对于专门卡C++的题目也是醉了...因为n太大了,而m最大也只有5,很明显是大数上的快速矩阵幂. 问题是如何构造出矩阵出来,之前做过骨牌的题目,就是利用DFS来构造的,感觉这道题在思路上是一样的,同样也是利用DFS先构造出矩阵 然后直接大数+快速矩阵幂撸一发就行了 #include<map> #include<set>

CodeForces621E 快速矩阵幂优化dp

有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去做的,正如快速矩阵幂最终会计算出答案一样,我们也最终会在这些不明意义的事情中实现目标. 题意:有 bb 个格子,每个格子有 nn 个数字,各个格子里面的数字都是相同的. 求从 bb 个格子中各取一个数字, 构成一个 bb 位数, 使得这个 bb 位数模 xx 为 kk 的方案数(同一格子内相同的数字

hdu 4291 矩阵幂 循环节

http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,而且矩阵的更神奇: g(g(g(n))) mod 109 + 7  最外层MOD=1e9+7  可以算出g(g(n))的循环节222222224,进而算出g(n)的循环节183120LL,然后由内而外计算即可 注释掉的是求循环节的代码 //#pragma comment(linker, "/STACK:102400000,102400000")

poj Matrix Power Series 矩阵幂求和

题意:给一个n*n的矩阵A,求k次幂之和 S = A + A2 + A3 + … + Ak 思路:矩阵快速幂. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef struct node { int matrix[55][55]; }Matrix; Matrix a,sa,unit; int n,m,k,i,j; Matrix add(Matrix a,M

POJ 2778 AC自动机+矩阵幂 不错的题

http://poj.org/problem?id=2778 有空再重新做下,对状态图的理解很重要 题解: http://blog.csdn.net/morgan_xww/article/details/7834801 另外做了矩阵幂的模板: //ac.sz是矩阵的大小 void mulmtr(long long x[MAXNODE][MAXNODE],long long y[MAXNODE][MAXNODE])//y=x*y { ll tmp[MAXNODE][MAXNODE]; for(in