博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2369 Permutations (置换的秩P^k = I)
阅读量:5054 次
发布时间:2019-06-12

本文共 1045 字,大约阅读时间需要 3 分钟。

题意

给定一个置换形式如
,问经过几次置换可以变为恒等置换

思路

就是求k使得P
k = I. 我们知道一个置换可以表示为几个轮换的乘积,那么
k就是所有轮换长度的最小公倍数. 把一个置换转换成轮换的方法也很简单, 从一个数出发按照置换图置换,直到置换到已经置换过的数,则这些数就构成一个轮换。

代码

  [cpp] #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, end) for (int i = begin; i <= end; i ++) using namespace std; int gcd(int a, int b){ return b?gcd(b, a%b):a; } int a[1005]; bool vis[1005]; int main(){ //freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); int n; while(scanf("%d", &n) != EOF){ for (int i = 1; i <= n; i ++){ scanf("%d", &a[i]); } MEM(vis, false); int res = 1; for (int i = 1; i <= n; i ++){ if (!vis[i]){ vis[i] = 1; int len = 1; int p = i; while (1){ p = a[p]; if (vis[p]) break; vis[p] = 1; len ++; } res = res / gcd(res, len) * len; } } printf("%d\n", res); } return 0; } [/cpp]

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114128.html

你可能感兴趣的文章
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>
二叉索引树 树状数组
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>