POJ 1026 Cipher 置换群

本文探讨了置换群在序列操作中的应用,通过置换群的解析和循环求解,解决了一个看似简单的数学问题。文章提供了从错误理解到正确解决过程的详细说明,并附有实现该算法的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:链接

方法:置换群

解析:

挺简单的置换群?

不过第一次太二了想错了。

我以为是直接按照那个序列搞一下置换群的幂就OK了

结果发现,我靠这好多循环也不影响- -那不是逗么。

所以赶紧刹回来求循环。

对于每一个循环内置换,之后就是水题了。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 210
using namespace std;
int n,k;
int a[N];
int b[N][N];
int v[N];
char tmp[N];
char print[N];
int tot;
int lenth;
void getn()
{
    memset(v,0,sizeof(v));
    for(int i=1;i<=n;i++)
    {
        int pt=i;
        if(!v[pt])tot++;
        int cnt=0;
        while(!v[pt])
        {
            v[pt]=1;
            b[tot][++cnt]=a[pt];
            pt=a[pt]; 
        }
        if(cnt!=0)b[tot][0]=cnt;
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        tot=0;
        getn();
        while(~scanf("%d",&k))
        {
            if(k==0){printf("\n");break;}
            char useless;
            scanf("%c",&useless);
            gets(tmp);
            int len=strlen(tmp);
            while(len<n)tmp[len++]=' ';
            tmp[len]='\0';
            for(int i=1;i<=tot;i++)
            {
                for(int j=1;j<=b[i][0];j++)
                {
                    int tmp2=(j+k)%b[i][0];
                    if(!tmp2)tmp2=b[i][0]; 
                    print[b[i][tmp2]-1]=tmp[b[i][j]-1]; 
                }
            } 
            for(int i=0;i<n;i++)
            {
                printf("%c",print[i]);
            }
            printf("\n");
        }
    }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值