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

题目

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

#include
#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;
}

你可能感兴趣的:(算法)