求助卡常, 90pts。
  • 板块P5557 旅行
  • 楼主strange757
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/21 21:32
  • 上次更新2023/10/27 19:00:33
查看原帖
求助卡常, 90pts。
265453
strange757楼主2022/7/21 21:32

rt。

#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
#define ll long long
using namespace std;
const int N = 4e5 + 5;
int n, fa[N][35], m, sz[N], belong[N], cnt;
int dis[N], lg[N];
template<typename T>inline void read(T &ff){
    T rr=1;ff=0;re char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')rr=-1;ch=getchar();}
    while(isdigit(ch)){ff=(ff<<1)+(ff<<3)+(ch^48);ch=getchar();}
    ff*=rr;
}
inline void dfs(int  u){
    if(belong[u]) return;
    sz[cnt]++;
    belong[u] = cnt;
    dfs(fa[u][0]);
}
inline int qpow(ll a, ll b, ll mod){
    ll now = 1;
    while(b){
        if(b & 1) now = (now * a) % mod;
        a = (a * a) % mod;
        b >>= 1; 
    }
    return  now;
}
inline int query(int u){
    if(belong[u]) return 0;
    dis[u] = query(fa[u][0]) + 1;
    return dis[u];
}
inline int pd(ll a, ll b){
    ll now = 1;
    while(b){
        if(b & 1) now = now * a;
        if(now >= n || a >= n) return 1e9;
        a = a*a;
        b >>= 1;
    }
    return now;
}
signed main(){
    read(n);
    lg[0] = -1;
    for(int i = 1; i <= n; i++) read(fa[i][0]), lg[i] = lg[i>>1] + 1;
    for(int j = 1; j <= 20; j++){
        for(int i = 1; i <= n; i++){
            fa[i][j] = fa[fa[i][j - 1]][j - 1];
        }
    }
    for(int i = 1; i <= n; i++){
        int x = n, now = i;
        for(int j = lg[n]; j >= 0; j--){
            if(x >= 1<<j) x -= 1<<j, now = fa[now][j];
        }
        if(!belong[now]) cnt++, dfs(now);
    }
    for(int i = 1; i <= n; i++) {
        if(!belong[i] && !dis[i]) query(i);
    }
    read(m);
    int s, t1, t2;
    for(int i = 1; i <= m; i++){
        read(s), read(t1), read(t2);
        int x = dis[s], now = s;
        int k = pd(t1, t2);
        if(k <= dis[s]){
            x = k, now = s;
            for(int j = lg[x]; j >= 0; j--){
                if(x >= (1<<j)) x -= (1<<j), now = fa[now][j]; 
            }
            printf("%d\n", now);
            continue;
        }
        for(int j = lg[x]; j >= 0; j--){
            if(x >= (1<<j)) x -= (1<<j), now = fa[now][j]; 
        }
        int mod = sz[belong[now]];
        x = qpow(t1%mod, t2, mod);
        x = ((x - dis[s])%mod + mod) % mod;
        for(int j = lg[x]; j >= 0; j--){
            if(x >= (1<<j)) x -= (1<<j), now = fa[now][j];
        }
        printf("%d\n", now);
    }
    return 0;
}
2022/7/21 21:32
加载中...