思路:思维题
用一个二维数组
a
[
k
]
[
i
]
a[k][i]
a[k][i]记录第
k
k
k步之后的
a
i
a_i
ai的值,用
c
[
i
]
c[i]
c[i]记录
k
−
1
k-1
k−1步时数组
a
a
a的每个值的个数,更新
a
[
k
]
[
i
]
=
c
[
a
[
k
−
1
]
[
i
]
]
a[k][i]=c[a[k-1][i]]
a[k][i]=c[a[k−1][i]]
P
S
PS
PS:当
k
>
n
k>n
k>n时,
a
a
a的值不再发生变化
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=2000+10;
typedef long long ll;
int n,q,a[N][N],c[N];
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[0][i];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) c[j]=0;
for(int j=1;j<=n;j++) c[a[i-1][j]]++;
for(int j=1;j<=n;j++) a[i][j]=c[a[i-1][j]];
}
cin>>q;
while(q--){
int x,k;
cin>>x>>k;
cout<<a[min(k,n)][x]<<endl;
}
}
return 0;
}