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。