置换群与轮换

昨晚BestCoder第一题:

一开始看了半天不知所云2333333

其实它是让求置换群的轮换

比如对于原题中的

有o(1)=2, o(2)=5, o(3)=4, o(4)=3, o(5)=1

其中o(1)=2,o(2)=5,o(5)=1就是一个轮换,转了一圈之后又回来了233

同理,o(3)=4, o(4)=3又是一个轮换。

所以输出答案为(1 2 5)(3 4)

---------------------------------------------------------------------------------

挺水的一个水题,结果不知道为什么我的代码总是TLE   T^T

终于知道为什么了T^T

while (~scanf(......))

注意加上那个~

因为OJ上读入结束之后scanf返回值是-1(即二进制11111111),加个~就可以让循环结束了

很隐蔽的bug......手测根本发现不了T^T

附代码

 1 #include "stdio.h"
 2 int a[100010];
 3 int v[100010];
 4 int tx,ty,n,i;
 5
 6 int main()
 7 {
 8     while (~scanf("%d\n",&n))
 9     {
10         for (i=1;i<=n;i++)
11         {
12             scanf("%d",&a[i]);
13             v[i]=0;
14         }
15         for (i=1;i<=n;i++)
16         {
17             if (v[i]==0)
18             {
19                 printf("(%d",i);
20                 v[i]=1;
21                 tx=i;
22                 ty=a[i];
23                 while (v[ty]==0)
24                 {
25                     printf(" ");
26                     v[ty]=1;
27                     tx=ty;
28                     ty=a[ty];
29                     printf("%d",tx);
30                 }
31                 printf(")");
32             }
33         }
34         printf("\n");
35     }
36     return 0;
37 }

Orz

时间: 2024-10-11 14:29:48

置换群与轮换的相关文章

POJ 1286-Necklace of Beads(Polya计数)

题目地址:POJ 1286 题意:n个珠子串成一个圆,用三种颜色去涂色.问一共有多少种不同的涂色方法(不同的涂色方法被定义为:如果这种涂色情况翻转,旋转不与其他情况相同就为不同.) 思路:Polya定理第一发,这道题其实就是一个最简单的板子题.要想明白Polya定理首先要知道置换,置换群和轮换的概念,可以参考这里(用例子很好理解). 项链可以进行旋转和翻转. 翻转:如果n是奇数,则存在n中置换,每种置换包含n/2+1种循环(即轮换). 如果n是偶数,如果对称轴过顶点,则存在n/2种置换,每种置换

hdu5338(2015多校4)--ZZX and Permutations(置换群)

题目链接:点击打开链接 题目大意:给出一个序列,分成若干个置换群,要求最终的序列的字典序最大. 要求字典序最大,那么从1开始向后遍历,尽量放较大的数 给出序列a1 a2 a3 ,,, ai   an 对于第i个数来说,可能有三种情况,第一种向前找能到达的序列的最大值ak,那么ak到ai就是一个轮换:第二种ai自身,或者是以ai结尾:第三种由i想后找,对于轮换来说,只能在i位置放ai+1,那么ai和ai+1只能构成轮换的一部分:在这三种可以放的值中选出最大值,也就是第i个位置能放的数 注意 1.当

poj3270--Cow Sorting(置换群)

题目链接:点击打开链接 题目大意:给出你n个数,要求把这n个数排列成有序的(由小到大),每次可以交换两个数,花费是这两个数的和,现在求最小的花费 置换群的入门 求出每一个轮换的圈,对于每一个轮换中,只有在自身内交换就能完成有序,而不需要和其它轮换交叉. 一个轮换的最小值temp,轮换中有num个数,轮换的总和是sum,整个序列的最小值min1 让一个轮换花费最少有两种可能 1.轮换自身交换,轮换的最小值和其他值交换num-1次,那么花费是sum-temp+(num-1)*temp 2.用全局的最

poj 3270 Cow Sorting(初涉置换群)

http://poj.org/problem?id=3270 大致题意:给出n个整数,要将它们转化成递增序列,每交换其中两个数的代价是这两个数之和.问排序成功后的最小代价. 该题考察的是置换群知识.在黑书p247上有详细的讲解.总结下置换群,方便复习. 群:给定一个集合G={a,b,c...}和集合G上的二元运算 ·,如果满足封闭性,结合律,存在单位元和逆元,则成集合G在运算'·'之下是一个群. 置换:n个元素1,2,....,n之间的置换可表示为  1     2     3     ...

2017-03-17 Codeforces 441D 置换群,好题 bzoj 4750 思维,按位计算

Codeforces 441D 题意:定义理想序列a[]:对于任意的i有a[i] = i.给出一个1到n的排列p[],可以将排列中的任意两个元素两两交换,定义f(p)为将p变为理想排列的最少交换次数,求将p变成排列q,使得f(q) = m 的最少交换次数和交换方案. tags:才知道置换群,看题解码的.. 使得一个排列有序的最小交换次数 = n - 置换群数目. 置换群,A->B,B->C,C->A,相当于一个轮换.   记住三点: 1.一个大小为L的置换群里面的元素至少且必能互换L-1

有关群论_置换群_等的简单介绍

群 群是一个集合G,连同一个运算"·",它结合任何两个元素a和b而形成另一个元素,记为a·b.符号"·"是对具体给出的运算,比如整数加法的一般占位符.要具备成为群的资格,这个集合和运算(G,·)必须满足叫做群公理的四个要求: 1. 封闭性: 对于所有G中a, b,运算a·b的结果也在G中. 2. 结合性: 对于所有G中的a, b和c,等式 (a·b)·c = a· (b·c)成立. 3. 单位元: 存在G中的一个元素e,使得对于所有G中的元素a,等式e·a = a·

poj 3128 Leonardo&#39;s Notebook (置换群的整幂运算)

题意:给你一个置换P,问是否存在一个置换M,使M^2=P 思路:资料参考 <置换群快速幂运算研究与探讨> https://wenku.baidu.com/view/0bff6b1c6bd97f192279e9fb.html 结论一: 一个长度为 l 的循环 T,l 是 k 的倍数,则 T^k 是 k 个循环的乘积,每个循环分别是循环 T 中下标 i mod k=0,1,2- 的元素按顺序的连接. 结论二:一个长度为 l 的循环 T,gcd(l,k)=1,则 T^k 是一个循环,与循环 T 不一

置换群

置换群(转) 看了几天置换群,一直没搞清楚定义是怎么回事,一个置换可以写成若干循环的乘积,那么如果置换求幂的话,一个循环不会跑到另一个循环里面去. 我们可以简单理解为这几个位置的数来回换. poj3270 给出一列数,求将这列数排成升序的最小花费,这里花费定义为交换两个数的和.例如给出一排数8 4 5 3 2 7,那么我们最终的状态为2 3 4 5 7 8,这里的轮换有(8 2 7)(4 5 3),这里8应该在第六个位置,而第6个位置是7,7应该在5这个位置,而第5个位置为2,2应该在1这个位置

poj1026--Cipher(置换群)

题目链接:点击打开链接 题目大意:给出一个编码的顺序,每经过一次编码第i位上的字符回到第a[i]位上.然后给出一个k,和初始的串,问编码k次后的串是什么. k可能会很大,不能暴力,所以要用置换群,找出轮换的环,假设环中有m个数,那么每编码m次,就代表这又回到了初始状态,可以用k%m,这样减少编码的次数.如果在记录轮换的位置,那么对于轮换中的第i个字符编码k次,就变成了轮换中的第(i+k)%m个字符.这样直接可以计算出最终的结果. 注意,题目不难,但是输入让人头疼,,,,经过多次wa,测试出只有(