hdu2371 矩阵乘法(求序列位置改变m次后的序列)
题意:
给你一个字符串,然后让你执行m次操作,每次操作把当前的字符串映射到他给你的位置序列的位置,比如给的是 3 1 2,第一步就是把原来的3的位置的字母变到1的位置,1的变到2的位置,2的变到3,就这样一直变换m次,最后给你一个变换完之后的,让你求原始的(原题这个地方没有叙述的很清楚)。
思路:
首先这种位置映射,或者是变换的很多都可以根据矩阵乘法来解决,这个题目的是个很简单的应用,比如我们要把1 2 3 4 5映射到 2 3 1 5 4的位置:
0 1 0 0 0 1
0 0 1 0 0 2
1 0 0 0 0 * 3
0 0 0 0 1 4
0 0 0 1 0 5 (这个是正向,题目是要求原始的,直接把n*n的矩阵变成自己的逆矩阵)
这样就ok了,映射几次就乘几个前面的那个n*n的矩阵就行了,矩阵乘法有结合律,所以可以矩阵快速幂去求,矩阵乘法的三重for循环本身也有优化(这个题目不优化也能过),还有就是,一开始就说了,这个题目是要求原始的字符串,所以是不停的往回除,矩阵除法可以转换成乘以要除的那个矩阵的逆矩阵,所以还是矩阵乘法。
#include<stdio.h>
#include<string.h> #define N 80 + 3
typedef struct
{
int mat[N][N];
}A; A mat_mat(A a ,A b ,int n)
{
A c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int k = 1 ;k <= n ;k ++)
for(int i = 1 ;i <= n ;i ++)
if(a.mat[i][k])
for(int j = 1 ;j <= n ;j ++)
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
return c;
} A q_mat(A a ,int b ,int n)
{
A c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int i = 1 ;i <= n ;i ++)
c.mat[i][i] = 1;
while(b)
{
if(b&1) c = mat_mat(c ,a ,n);
a = mat_mat(a ,a ,n);
b /= 2;
}
return c;
} int main ()
{
char str[N];
int num[N] ,i ,n ,m;
A a;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
memset(a.mat ,0 ,sizeof(a.mat));
for(i = 1 ;i <= n ;i ++)
{
scanf("%d" ,&num[i]);
a.mat[num[i]][i] = 1;
}
getchar();
gets(str);
a = q_mat(a ,m ,n);
for(i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
if(a.mat[i][j]) num[i] = j;
for(i = 1 ;i <= n ;i ++)
printf("%c" ,str[num[i] - 1]);
puts("");
}
return 0;
}
hdu2371 矩阵乘法(求序列位置改变m次后的序列)的更多相关文章
- 【poj3070】矩阵乘法求斐波那契数列
[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...
- ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」
传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...
- POJ ---3070 (矩阵乘法求Fibonacci 数列)
Fibonacci Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...
- gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)
可逆方阵 A 的逆记为,A−1,需满足 AA−1=I. 在 BLAS 的各种实现中,一般都不会直接给出 matrix inverse 的直接实现,其实矩阵(方阵)的逆是可以通过 gemm()和gesv ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- 【日常学习】codevs1287 矩阵乘法题解
转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看. 先上题目 题目描写叙述 Description 小明近期在为线性代数而头疼,线性代数确实非 ...
- POJ 2888 Magic Bracelet [Polya 矩阵乘法]
传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...
- BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法
BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...
- 【bzoj3329】Xorequ 数位dp+矩阵乘法
题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行每行一个正整数N 输出 2*T行第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 样例 ...
随机推荐
- 第十届蓝桥杯省赛-试题E: RSA 解密
试题E: RSA 解密 这里涉及到很多数论的知识:质因子分解,扩展欧几里得算法,快速幂算法,利用快速乘算法求解快速幂(mod太大导致不能直接乘,而是需要使用加法来替代乘法) 另外还需要注意扩展欧几里得 ...
- 【Azure 云服务】Azure Cloud Service在发布新部署后遇见不能RDP(远程连接)到实例时如何处理?
Azure 云服务是PaaS 的一个示例. 与 Azure 应用服务一样,此技术设计用于支持可缩放.可靠且运营成本低廉的应用程序. 同样,应用服务托管在虚拟机 (VM) 上,Azure 云服务也是如此 ...
- The Red Button
The Red Button 问题 问题描述 Piegirl终于发现了红色按钮,你现在还剩最后一个机会去改变这个结局.这个按钮下面的电路由n个从0到n-1编号节点组成.为了关闭这个按钮,这n个节点必须 ...
- C# 应用 - 使用 WepApp 处理文件上传、下载请求
1. 代码 /// <summary> /// 文件上传下载控制器 /// </summary> public class FileController : ApiContro ...
- 最新版Swagger 3升级指南和新功能体验!
Swagger 3.0 发布已经有一段时间了,它于 2020.7 月 发布,但目前市面上使用的主流版本还是 Swagger 2.X 版本和少量的 1.X 版本,然而作为一名合格的程序员怎么能不折腾新技 ...
- ResNet的个人总结
ResNet可以说是我认真读过的第一篇paper,据师兄说读起来比较简单,没有复杂的数学公式,不过作为经典的网络结构还是有很多细节值得深究的.因为平时不太读英文文献,所以其实读的时候也有很多地方不是很 ...
- 一些DevTools的小技巧-让你不止会console.log()
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/beyond-console-log-leve ...
- frp穿透内网使用vsftpd服务
本篇文章将会介绍如何使用frp穿透内网以及如何在centos8环境下安装和使用vsftpd,最后在公网通过frp穿透内网使用ftp. 一.内网穿透神器frp frp 是一个专注于内网穿透的高性能的反向 ...
- 力扣 - 208. 实现Trie(前缀树)
目录 题目 思路 代码 复杂度分析 题目 208. 实现 Trie (前缀树) 思路 在我们生活中很多地方都用到了前缀树:自动补全,模糊匹配,九宫格打字预测等等... 虽然说用哈希表也可以实现:是否出 ...
- Spring Boot 轻量替代框架 Solon 1.3.15 发布
Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...