牛客多校2 - Just Shuffle(置换群的幂)

题目链接:点击查看

题目大意:给出一个置换 B,求出一个置换 A ,使得 A^k=B,k 是一个大质数

题目分析:等式两边同时乘以 t 次幂,变为 A^{k*t}=B^t,显然当 t 为 k 的逆元时,有式子 A = B^t,所以求一下 B 的 t 次幂就好了

代码:
 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long LL;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const int N=1e5+100;

int a[N],ans[N];

bool vis[N];

int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",a+i);
	for(int i=1;i<=n;i++)
	{
		if(vis[i])
			continue;
		vectorcircle;
		int pos=i;
		while(!vis[pos])
		{
			circle.push_back(pos);
			vis[pos]=true;
			pos=a[pos];
		}
		int sz=circle.size();
		int t=0;
		while(t

 

你可能感兴趣的:(置换群)