欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2020牛客暑期多校训练营(第二场)Just Shuffle

程序员文章站 2022-05-12 12:28:43
...

题目

2020牛客暑期多校训练营(第二场)Just Shuffle
这道题在打的时候没做出来(废话)
然后补题时看了一点paper
再看了别人的标程
过了
代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,i,j,k,l,o,p,a[100005],v[100005],ans[100005],x,y,t;
void egcd(ll x,ll y,ll &a,ll &b)
{
    if(!y)
	{
        a=1;
		b=0;
        return;
    }
    egcd(y,x%y,b,a);
    b-=a*(x/y);
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for (i=1;i<=n;i++)scanf("%lld",a+i);
	for (i=1;i<=n;i++)
	{
		if(v[i]) continue;
		v[i]=1;
		vector<ll> vi;
		vi.push_back(i);
		for (j=a[i];!v[j];j=a[j]) vi.push_back(j),v[j]=1;
		t=m%vi.size();
		egcd(t,vi.size(),x,y);
		if (x<0) x+=vi.size();
		for (j=0;j<vi.size();j++) ans[vi[j]]=vi[(j+x)%vi.size()];
	}
	for (i=1;i<=n;i++) printf("%lld ",ans[i]);
	cout<<endl;
}
相关标签: 算法