1. 程式人生 > >poj 1721 CARDS(置換群)

poj 1721 CARDS(置換群)

gif open ref log 技術分享 aps bre lan sam

題目鏈接: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 }
View Code

poj 1721 CARDS(置換群)