倍增 RE #6~10 求助
查看原帖
倍增 RE #6~10 求助
926886
kind_Ygg楼主2024/10/15 17:27
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+5;
ll n,q,s;
ll fa[N];
ll x,k,ans[N];
ll f[N][20];
ll deep[N];
vector<ll> edge[N];
ll lowbit(ll x){return x&-x;}
inline unsigned int get(unsigned int x)
{
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return s = x; 
}
void dfs(ll rt,ll fa)
{
	deep[rt]=deep[fa]+1;
	for(auto i:edge[rt])
		dfs(i,rt);
	return;
}
ll root;
signed main()
{
	freopen("P5903.in","r",stdin);
	freopen("P5913.out","w",stdout);
	cin>>n>>q>>s;
	for(ll i=1;i<=n;i++)
	{ 
		cin>>fa[i];
		if(!fa[i])
		{
			root=i;
			continue;
		}
		edge[fa[i]].push_back(i);
	}
	for(ll i=1;i<=n;i++) f[i][0]=fa[i];
	for(ll len=1;len<=19;len++)
		for(ll i=1;i<=n;i++)
			f[i][len]=f[f[i][len-1]][len-1];
	dfs(root,0);
	for(ll i=1;i<=q;i++)
	{
		x=((get(s)^ans[i-1])%n)+1;
		k=(get(s)^ans[i-1])%deep[x];
		for(ll j=19;j>=0;j--)
		{
			if((1<<j)<=k)
			{
				x=f[x][j];
				k-=(1<<j);
			}
		}
		ans[i]=x;
	}
	for(ll i=2;i<=q;i++)
		ans[1]^=(i*ans[i]);
	cout<<ans[1]<<'\n';
	return 0;
}
2024/10/15 17:27
加载中...