1 条题解

  • 0
    @ 2025-4-8 14:45:56

    题目大意

    给你目标状态和置换的次数,请你求出初始状态。

    解题思路

    置换。 通过找规律可以发现,这个序列是存在循环节的,即置换多少次后就会又变回原来的状态。 那么我们可以用置换次数%循环节,然后在置换tmt-m%t次即为答案。(mm为置换次数,tt为循环节)。

    标程

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    #include<cmath>  
    #define N 1003   
    using namespace std;  
    int n,m;  
    int cnt[N],a[N],ans[N],l[N],use[N],b[N];  
    int main()  
    {  
        //freopen("a.in","r",stdin);
        //freopen("my.out","w",stdout);
        scanf("%d%d",&n,&m);  
        int maxn=0;  
        for (int i=1;i<=n;i++)  
         scanf("%d",&a[i]),cnt[i]=a[i];
        bool flag=1;  int t=0;
        while (1){
        	t++;
        	for (int i=1;i<=n;i++)  b[i]=a[a[i]];
        	for (int i=1;i<=n;i++)
        	 if (cnt[i]!=b[i]) {
        	 	flag=false;
        	 	break;
        	 }
        	if (flag)  break;
        	flag=true;
        	for (int i=1;i<=n;i++) a[i]=b[i];
        }
        for (int i=1;i<=n;i++) a[i]=b[i];
        t=t-m%t;
        for (int i=1;i<=t;i++){
        	for (int j=1;j<=n;j++)  b[j]=a[a[j]];
        	for (int j=1;j<=n;j++)  a[j]=b[j];
        }
        for (int i=1;i<=n;i++)  
          printf("%d\n",a[i]);  
    }   
    
    • 1

    信息

    ID
    722
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者