1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #include<bits/stdc++.h> #define ll long long #define ull unsigned long long #define maxn 1005 #define put() putchar('\n') #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar> using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } namespace Debug{ Tp void _debug(char* f,Ty t){cerr<<f<<'='<<t<<endl;} Ts void _debug(char* f,Ty x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} Tp ostream& operator<<(ostream& os,vector<Ty>& V){os<<"[";for(auto& vv:V) os<<vv<<",";os<<"]";return os;} #define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; struct node{ int siz,w; }g[maxn]; int prime[maxn],cnt,vis[maxn]; inline void getprime(int n) { int i,j;vis[1]=1; for (i=2;i<=n;i++) { if (!vis[i]) prime[++cnt]=i; for (j=1;j<=cnt&&prime[j]*i<=n;j++) { vis[i*prime[j]]=1; if (i%prime[j]==0) break; } } } vector<int>to[maxn]; int siz[maxn],Max[maxn],root; inline void dfs(int x,int pre,int SUM) { Max[x]=0,siz[x]=1;int i; for (auto y:to[x]) if (y^pre) { dfs(y,x,SUM); siz[x]+=siz[y]; Max[x]=max(Max[x],siz[y]); } Max[x]=max(Max[x],SUM-siz[x]); if (!root||Max[root]>Max[x]) root=x; } const int mod=998244353; #define fi first #define se second int w[105]; inline ull calc(int x,int pre) { int i;ull sum=1;siz[x]=1; vector<ull>a; for (auto y:to[x]) if (y^pre) a.push_back(calc(y,x)*prime[siz[y]]%mod),siz[x]+=siz[y]; sort(a.begin(),a.end()); int len=a.size(); for (int i=0;i<len;i++) sum=(sum+a[i])%mod; return sum; } inline void solve(int Cas) { int i,x,y,n,len=0; read(n); for (i=1;i<=n;i++) to[i].clear(); for (i=1;i<=n;i++) { read(x);if (x) { to[x].push_back(i); to[i].push_back(x); } } root=0; dfs(1,0,n); for (i=1;i<=n;i++) if (Max[i]==Max[root]) w[++len]=calc(i,0); sort(w+1,w+1+len); g[Cas].siz=n,g[Cas].w=w[1];
} signed main(void){ int T,i,j; read(T); getprime(1000); for (i=1;i<=T;i++) solve(i); for (i=1;i<=T;i++) { for (j=1;j<=i;j++) if (g[i].siz==g[j].siz&&g[i].w==g[j].w) { printf("%d\n",j); break; } } return 0; }
|