poj 1721 CARDS(置换群)

题目链接:poj 1721 CARDS

题意:

看了半天才看懂,就是一次置换为b[i]=a[a[i]],a[i]=b[i]。

现在已经知道了置换了多少次和当前的序列,问你最原来的序列为

题解:

将这个置换的循环次数ans找出来,再做ans-s次就行了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define F(i,a,b) for(int i=a;i<=b;++i)
 5 using namespace std;
 6 #define ___ freopen("c:\\code\\in.txt","r",stdin);
 7 const int N=1010;
 8
 9 int n,s,a[N],init[N],b[N];
10
11 int Is_same()
12 {
13     F(i,1,n)if(a[i]!=init[i])return 0;
14     return 1;
15 }
16
17 int main()
18 {
19     while(~scanf("%d%d",&n,&s))
20     {
21         F(i,1,n)scanf("%d",init+i),a[i]=init[i];
22         int cnt=0;
23         while(1)
24         {
25             cnt++;
26             F(i,1,n)b[i]=a[a[i]];
27             F(i,1,n)a[i]=b[i];
28             if(Is_same())break;
29
30         }
31         s=s%cnt,cnt-=s;
32         F(i,1,cnt)
33         {
34             F(j,1,n)b[j]=a[a[j]];
35             F(j,1,n)a[j]=b[j];
36         }
37         F(i,1,n)printf("%d\n",a[i]);
38     }
39     return 0;
40 }

时间: 2024-10-18 03:04:28

poj 1721 CARDS(置换群)的相关文章

poj 1721 CARDS(置换)

http://poj.org/problem?id=1721 大致题意:原始序列通过洗牌机洗牌s次后变为当前序列,已知当前序列,求原始序列. 在置换群快速幂运算 研究与探讨中最后有详解,有两种解法,一种是求出置换的长度a(即一副牌洗a次后变回原来的位置),现已知原始序列置换s次变为当前序列,那么当前序列再置换a-s次就是原始序列了.求a就是直接模拟每个置换的过程,直到某序列与当前序列相等.另一种是置换的开方,相当于原始序列的2^s幂是当前序列,将当前序列开2^s次方便是原始序列. 第二种方法暂时

[POJ 1721]CARDS

Description Alice and Bob have a set of N cards labelled with numbers 1 ... N (so that no two cards have the same label) and a shuffle machine. We assume that N is an odd integer. The shuffle machine accepts the set of cards arranged in an arbitrary

poj 1026 Cipher (置换群)

链接:poj 1026 题意:给定n个大小1-n的不同的整数作为密钥,给定一个字符串, 求将该字符串经过k次编码后的字符串 分析:暴力求解会超时,可以利用置换群的知识解题 置换群:一个有限集合的一一变换叫做置换,一对对置换组成了置换群. 对于一个集合a(a[1],a[2],a[3]...a[n]) 通过置换可以变成 (b[a[1]],b[a[2]],b[a[3]]...b[a[n]]) b的作用就是置换(可以理解为某种函数的作用),将原来的集合映射成具有 相应次序的集合a',a'可以看做是a的相

POJ 3270-Cow Sorting(置换群)

题目地址:POJ 3270 题意:有n头牛,每头牛有一个独一无二的"愤怒值",要想把他们的愤怒值从小到大排序(交换任意两头牛位置所花费的时间为他们愤怒值的和),求最小的交换时间. 思路: 1.找出初始状态和结束状态(初始状态为题目所给,结束状态为从小到大排列) 2.画出置换群,在里面找循环.例如 初始状态:8 4 5 3 2 7 结束状态:2 3 4 5 7 8 从头开始找8->2->7->8,所以一个置换群是(8,2,7),然后在两个状态中去掉这三个点,从头开始找4

poj 2369 Permutations(置换群)

题目链接:poj 2369 Permutations 题意: 给你一个置换序列,问你循环周期是多少. 题解: 找到每个子循环周期,总体的循环周期就是这些子循环周期的最小公倍数. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define F(i,a,b) for(int i=a;i<=b;++i) 5 using namespace std; 6 7 const int N=1010

[bzoj1004][HNOI2008][Cards] (置换群+Burnside引理+动态规划)

Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.Sun发现这个问题有点难度,决

poj 3128 关于置换群的规律

Leonardo's Notebook Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2433   Accepted: 1037 Description - I just bought Leonardo's secret notebook! Rare object collector Stan Ucker was really agitated but his friend, special investigator S

POJ 1721

好像不需要用到开方什么的... 可以知道,一副牌即是一个循环,那么,由于GCD(L,K)=1,所以一次洗牌后,亦是一个循环.其实,K次洗牌等于是T^(2^K)了.既然是循环,必定有周期.那么,周期是多少呢?以例子为例:1->4->6->2->7->3->5.其实对于第一个数(从零始)4,总会有先后移了2^a次方而回到原点,此时就是一个周期了.即是求2^a=1(mod n).求出最小的a即可知道周期.s%a=t.那么,即是差a-t个状态就可以回到初始的了. #includ

acm数学(待续)

意图写出http://www.cnblogs.com/kuangbin/archive/2012/08/28/2661066.html这个东西的完善版. 1.置换,置换的运算 poj 2369 Permutations置换群中有一个定理:设T为一置换,e为单位置换,T^k=e,那么k的最小正整数解是T的拆分的所有循环长度的最小公倍数. 1 #include <cstdio> 2 const int maxn = 1005; 3 int gcd(int a,int b){return b ==