https://ac.nowcoder.com/acm/contest/5667/J
题目大意:给你一个置换A,使得置换P^k=A,让你求出置换P。
思路:我们根据置换A再置换z次,那么就等于置换p 置换z*k次,如果z*k%len==0,那么将会回到单位序列,那我们再置换一次则是置换p,即是z*k%len==1,则z是k在模len下的逆元。我们求出A的每一个循环,再求出z,就可以求出该循环内的对应位置。因为满足gcd(len,k)==1,那我们可以直接在循环中将i后移z个位置。
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define sc second
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define ac cout<<ans<<"\n"
#define pb push_back
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=998244353;
const ll N =5e5+10;
const ll M =250000;
const double eps = 1e-4;
//const double pi=acos(-1);
ll re(){ll x;scanf("%lld",&x);return x;
}
ll n,k;
int a[N];
int vis[N];
int b[N];
vector<int> g;
void gg(){ll l=g.size(),p=0;for(ll i=0;i<l;i++) if((i*k)%l==1) {p=i;break;}for(ll i=0;i<l;i++) b[g[i]]=g[(i+p)%l];
}
void slove(){n=re(),k=re();for(int i=1;i<=n;i++) a[i]=re();for(int i=1;i<=n;i++){if(vis[i]) continue;int x=i;g.clear();while(!vis[x]){vis[x]=1;g.pb(x);x=a[x];}gg();}for(int i=1;i<=n;i++) printf("%d ",b[i]);
}
int main(){int t=1;// t=re();while(t--) slove();return 0;
}