1 条题解
-
0
题目大意
给你目标状态和置换的次数,请你求出初始状态。
解题思路
置换。 通过找规律可以发现,这个序列是存在循环节的,即置换多少次后就会又变回原来的状态。 那么我们可以用置换次数循环节,然后在置换次即为答案。(为置换次数,为循环节)。
标程
#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
- 上传者