求助50分
  • 板块P5557 旅行
  • 楼主蒟蒻丁
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/9/17 19:49
  • 上次更新2023/10/27 11:09:30
查看原帖
求助50分
251882
蒟蒻丁楼主2022/9/17 19:49

后面都是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&&sum;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());
}
2022/9/17 19:49
加载中...