poj 1721

关于置换群的应用。

之前的单纯置换的题目做多了,加上读题目没有读懂,思维惯性就来了,导致弄了好久。后面直接搜的题解。

参考:http://www.cnblogs.com/kuangbin/archive/2012/09/04/2670500.html

题目大意:给n站牌,S次洗牌,要求得出洗牌后每个位置所在的答案。a[a[i]];

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=1006;
 6 int a[maxn],b[maxn],c[maxn];
 7 int n,m;
 8 int solve()
 9 {
10     int j;
11     int cnt=0;
12     while(1){
13         for(int i=1;i<=n;i++)
14             b[i]=c[c[i]];
15         cnt++;
16         for(j=1;j<=n;j++)
17             if(b[j]!=a[j])
18                 break;
19         if(j>n)
20             break;
21         for(int i=1;i<=n;i++)
22             c[i]=b[i];
23     }
24 
25     return cnt;
26 }
27 
28 int main()
29 {
30     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
31     while( cin >> n >> m){
32         for(int i=1;i<=n;i++){
33             cin >> a[i];
34             c[i]=b[i]=a[i];
35         }
36 
37         int cnt=solve(); ///计算循环的次数,最少需要多少次
38         m=cnt-m%cnt; ///优化的核心
39         while(m--){
40             for(int i=1;i<=n;i++)
41                 b[i]=a[a[i]];
42             for(int i=1;i<=n;i++)
43                 a[i]=b[i];
44         }///直接暴力
45         for(int i=1;i<=n;i++)
46             cout << b[i] <<endl;
47     }
48 
49     return 0;
50 }

思维惯性真的是要不得qwq。

posted @ 2018-05-17 21:33  flyer_duck  阅读(180)  评论(0编辑  收藏  举报