后面都是WA,但是错误都出在80行到100行,完全看不出来哪里错了
#include<iostream>
#include<cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
ll n,m,f[2010001][33],dep[2010001],len[2001100],col[2100001],tot;
void dfs(ll x,ll fa){
if(dep[x]){
col[x]=++tot;
len[tot]=dep[fa]+1-dep[x];
return ;
}
dep[x]=dep[fa]+1;
if(col[f[x][0]])col[x]=col[f[x][0]];
else {
dfs(f[x][0],x);
col[x]=col[f[x][0]];
}
}
ll ksm(ll x,ll k,ll le){
ll tmp=1;
while(k){
if(k%2==1)tmp=tmp*x%len[le];
x=x*x%len[le],k>>=1;
}
return tmp;
}
ll KSM(ll x,ll k){
ll tmp=1;
while(k){
if(k%2==1){
if(tmp*x<n)tmp=tmp*x;
else return 1e13;
}
x=x*x,k>>=1;
}
return tmp;
}
ll solve(){
ll pos,a2,a3,tt=1e13;
scanf("%lld%lld%lld",&pos,&a2,&a3);
tt=KSM(a2,a3);
ll sum=min(n,tt);
for(ll i=28;i>=0&∑i--){
if(sum&(1<<i))pos=f[pos][i];
}
if(tt<=n)return pos;
ll coll=col[pos],Len=len[coll];
ll step=(ksm(a2,a3,coll)-n%Len+Len*3)%Len;
for(ll i=28;i>=0&&step;i--){
if(step&(1<<i))pos=f[pos][i];
}
return pos;
}
int main(){
freopen("tese.txt","r",stdin);
freopen("text.txt","w",stdout);
cin>>n;
for(ll i=1;i<=n;i++)scanf("%lld",&f[i][0]);
for(ll j=1;j<=28;j++)
for(ll i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
for(ll i=1;i<=n;i++)
if(!dep[i])dfs(i,0);
cin>>m;
for(ll i=1;i<=m;i++)printf("%lld\n",solve());
}