HDOJ - 2371 矩阵乘法
2012-10-11 11:27
120 查看
构造转换矩阵...如.2 3 1 5 4..构造成
0 0 1 0 0
1 0 0 0 0
0 1 0 0 0
0 0 0 0 1
0 0 0 1 0
将 (1,2,3,4,5)与这个矩阵相乘能变成(2,3,1,5,4)
Program:
0 0 1 0 0
1 0 0 0 0
0 1 0 0 0
0 0 0 0 1
0 0 0 1 0
将 (1,2,3,4,5)与这个矩阵相乘能变成(2,3,1,5,4)
Program:
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<map> #include<queue> #include<stack> #include<set> #define ll long long #define oo 2000000000 #define pi acos(-1) using namespace std; struct node { int s[85][85]; }h,_2jie[32]; int n,m; char s[85],ans[85]; node mul(node a,node b) { int k,i,j; node h; memset(h.s,0,sizeof(h.s)); for (k=1;k<=n;k++) for (i=1;i<=n;i++) for (j=1;j<=n;j++) h.s[i][j]+=a.s[i][k]*b.s[k][j]; return h; } node GetMatrix(int m) { int i; _2jie[0]=h; for (i=1;i<=30;i++) _2jie[i]=mul(_2jie[i-1],_2jie[i-1]); memset(h.s,0,sizeof(h.s)); for (i=1;i<=n;i++) h.s[i][i]=1; for (i=0;i<=30;i++) if (m & (1<<i)) h=mul(h,_2jie[i]); return h; } int main() { int i,x,t[85]; while (~scanf("%d%d",&n,&m)) { if (!n && !m) break; memset(h.s,0,sizeof(h.s)); for (i=1;i<=n;i++) { scanf("%d",&x); h.s[i][x]=1; } h=GetMatrix(m); for (i=1;i<=n;i++) for (x=1;x<=n;x++) if (h.s[i][x]==1) t[x]=i; gets(s+1); gets(s+1); for (i=1;i<=n;i++) ans[i]=s[t[i]]; ans[n+1]='\0'; puts(ans+1); } return 0; }
相关文章推荐
- HDOJ 4602 - Partition 打表找公式,然后矩阵乘法解决..
- hdoj 3521 An easy Problem(矩阵乘法)
- 【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)
- HDOJ 4549 - M斐波那契数列 费马小定理,矩阵乘法
- 【矩阵乘法】hdu hdoj 1757 A Simple Math Problem
- HDOJ-1757A Simple Math Problem(矩阵乘法快速幂)
- CUDA 矩阵乘法优化
- 矩阵乘法编写,从文件输入输出
- 矩阵的乘法算法
- 矩阵的乘法
- 在矩阵乘法,为什么 Matlab这么快?
- poj 3233 矩阵乘法累加
- srm#397_div1_500pt 矩阵乘法+快速模幂
- zoj 2317 Nice Patterns Strike Back(矩阵乘法)
- hdoj 1757 A Simple Math Problem 【矩阵快速幂】
- POJ 3233 - 矩阵乘法及其性质和优化
- 十个利用矩阵乘法解决的经典题目--Matrix67
- 【矩阵乘法】bzoj2326 [HNOI2011]数学作业
- dp 最优矩阵乘法
- 矩阵乘法在2D图形中应用