题意

顺次给出 $m$个置换,反复使用这 $m$ 个置换对一个长为 $n$ 初始序列进行操作,问 $k$ 次置换后的序列。$m<=10, k<2^31$。

题目链接

分析

对序列的置换可表示成乘上一个矩阵,例如

$$\begin{bmatrix}
0 & 0 &  0& 0 & 0 & 1 & 0\\
1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 1 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 0 & 0 & 1\\
0 & 0 & 0 & 0 & 1 &0  &0 \\
0 & 1 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 1 & 0 &0  & 0
\end{bmatrix}
\times \begin{bmatrix} 1\\  2\\ 3\\ 4\\ 5\\ 6\\ 7 \end{bmatrix}
 = \begin{bmatrix} 6\\  1\\ 3\\ 7\\ 5\\ 2\\ 4 \end{bmatrix}$$

因此,只需要将 $m$ 个“置换”乘起来,然后执行 $k/m$ 次,剩下的 $k \% m$ 次模拟一下。

#include<cstdio>
#include<cstring>
using namespace std; typedef long long ll;
struct matrix
{
int r, c;
int mat[][];
matrix(){
memset(mat, , sizeof(mat));
}
};
int n, m, k; matrix mul(matrix A, matrix B) //矩阵相乘
{
matrix ret;
ret.r = A.r; ret.c = B.c;
for(int i = ;i < A.r;i++)
for(int k = ;k < A.c;k++)
for(int j = ;j < B.c;j++)
{
ret.mat[i][j] = (ret.mat[i][j] + A.mat[i][k] * B.mat[k][j]);
}
return ret;
} matrix mpow(matrix A, int n)
{
matrix ret;
ret.r = A.r; ret.c = A.c;
for(int i = ;i < ret.r;i++) ret.mat[i][i] = ;
while(n)
{
if(n & ) ret = mul(ret, A);
A = mul(A, A);
n >>= ;
}
return ret;
} int main()
{
scanf("%d%d%d", &n, &m, &k);
matrix A;
A.r = A.c = n;
for(int i = ;i < n;i++) A.mat[i][i] = ;
int t = k % m;
matrix yu; yu.r = yu.c = n;
for(int i = ;i < m;i++)
{
if(i == t) yu = A; //记录剩余部分的乘积 matrix tmp; tmp.r = tmp.c = n;
for(int j = ;j < n;j++)
{
int x;
scanf("%d", &x);
tmp.mat[j][x-] = ;
}
A = mul(tmp, A);
}
A = mpow(A, k/m);
A = mul(yu, A); //注意顺序,矩阵乘法不满足交换律 for(int i = ;i < n;i++)
for(int j = ;j < n;j++)
if(A.mat[i][j]) printf("%d%c", j+, i == n- ? '\n' : ' ');
}

参考链接:

1. 十个利用矩阵乘法解决的经典问题——Matrix67

2. https://www.cnblogs.com/zhchoutai/p/6789494.html

最新文章

  1. 前端MVVM框架设计及实现
  2. AngularJS版本下载
  3. Java_Eclipse安装Git插件
  4. OC之160728
  5. how to learn device driver
  6. java String 两种不同的赋值 比较
  7. c语言字符串库函数#include&lt;string.h&gt;
  8. 初学Log4Net
  9. MYSQL 数据库导入导出命令
  10. [OPENCV]cvHoughLines2使用说明
  11. ASPCMS_判断语句if标签的使用
  12. GO入门——4. 数组、切片与map
  13. sql 获取批处理信息的脚本(优化器在处理批处理时所发生的优化器事件)
  14. Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问
  15. CentOS 6.5 yum安装mysql5.6或其他版本【默认yum只能安装mysql 5.1】 by jason
  16. [android]Intent跳转新的Activity可以传递数据过去
  17. 简化delegate写法
  18. 「NOIP 2013」 货车运输
  19. Linux下抓取登陆用户密码神器mimipenguin
  20. MongoDB的连接字符串

热门文章

  1. wmi的作用
  2. 用Python实现扑克牌面试题思路
  3. Shell基础快速入门 了解shell运行原理
  4. SAS学习笔记62 通过压缩变量长度来实现数据集压缩
  5. java之结合代码理解synchronized关键字
  6. C# CheckBoxList绑定值,设置及获取
  7. IIS初始化设置预加载,解决程序池被回收第一次访问慢问题
  8. C# 连接SQLServer数据库自动生成model类代码
  9. 2 Match、Filter、排序、分页、全文检索、短语匹配、关键词高亮
  10. iOS自动签名网站