常规做法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define N 300
int a[N],b[N],fa[N];
char s1[N],s2[N];
int maze[N][N];
int num[N],m;
int gcd(int a,int b)
{
if(a<b) swap(a,b);
int c;
while(b) c=a%b,a=b,b=c;
return a;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int i,j,l,k,time=1;
for(i=1;i<=n;i++) scanf("%d",&b[i]);
for(i=1;i<=n;i++) a[b[i]]=i;
memset(fa,0,sizeof(fa));
m=0;
for(i=1;i<=n;i++)
{
if(fa[i]==false)
{
for(l=0,k=i;fa[k]==false;k=a[k])
{
fa[k]=true;
maze[m][l++]=k;
}
num[m++]=l;
time=time*l/gcd(time,l);
}
}
while(scanf("%d",&k)&&k)
{
gets(s1);
for(i=strlen(s1);i<=n;i++) s1[i]=' ';
k=k%time;
for(i=0;i<m;i++)
{
l=k%num[i];
for(j=0;j<num[i];j++)
s2[maze[i][j]]=s1[maze[i][(j+l)%num[i]]];
}
for(j=1;j<=n;j++)
printf("%c",s2[j]);
printf("\n");
}
printf("\n");
}
return 0;
}
之前做一下矩阵,发现有矩阵快速幂,又先到了快速幂,突然先到置换群有没快速幂
很意外写了一个置换群的快速幂,我也觉得很神奇
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define N 300
int a[N],b[N],fa[N];
char s1[N],s2[N];
int gcd(int a,int b)
{
if(a<b) swap(a,b);
int c;
while(b) c=a%b,a=b,b=c;
return a;
}
void groud_change(int a[],int b[],int n)
{
int c[N],d[N];
memcpy(c+1,a+1,n*sizeof(int));
memcpy(d+1,b+1,n*sizeof(int));
for(int i=1;i<=n;i++) a[i]=d[c[i]];
}
void groud_power(int a[],int n,int r)
{
int b[N];
memcpy(b+1,a+1,n*sizeof(int));
for(int i=1;i<=n;i++) a[i]=i;
while(r)
{
if(r&1) groud_change(a,b,n);
groud_change(b,b,n);
r>>=1;
}
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int i,j,l,k,time=1;
for(i=1;i<=n;i++) scanf("%d",&b[i]);
for(i=1;i<=n;i++) a[b[i]]=i;
memset(fa,0,sizeof(fa));
for(i=1;i<=n;i++)
{
if(fa[i]==false)
{
for(l=0,k=i;fa[k]==false;k=a[k],l++)
fa[k]=true;
time=time*l/gcd(time,l);
}
}
while(scanf("%d",&k)&&k)
{
gets(s1);
for(i=strlen(s1);i<=n;i++) s1[i]=' ';
k=k%time;
memcpy(b+1,a+1,n*sizeof(int));
groud_power(b,n,k);
for(i=1;i<=n;i++)
s2[i]=s1[b[i]];
for(j=1;j<=n;j++)
printf("%c",s2[j]);
printf("\n");
}
printf("\n");
}
return 0;
}