Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define forr(i, a, b) for(int i=(int)(a);i<(int)(b);i++)
- #define forn(i,n) forr(i,0,n)
- #define dforn(i,n) for(int i=(int)(n-1);i>=0;i--)
- #define forall(it, v) for(auto it=v.begin();it!=v.end();it++)
- #define pb push_back
- typedef long long ll;
- const int MAXN=3000050;
- int n,f[MAXN];
- vector<int> G[MAXN];
- vector<pair<int,int>> st,topsort;
- bool used[MAXN];
- void getTopsort(){
- st.pb(make_pair(0,-1));
- while(!st.empty()){
- int v=st.back().first;
- int p=st.back().second;
- topsort.pb(st.back());
- st.pop_back();
- forn(i,G[v].size()){
- int w=G[v][i];
- if(w==p) continue;
- st.pb(make_pair(w,v));
- }
- }
- reverse(topsort.begin(),topsort.end());
- }
- bool check(int k){
- forn(i,topsort.size()){
- int v=topsort[i].first;
- int p=topsort[i].second;
- f[v]=1;
- forn(j,G[v].size()){
- int w=G[v][j];
- if(w==p) continue;
- f[v]+=f[w];
- }
- if(f[v]>k) return false;
- if(f[v]==k) f[v]=0;
- }
- return true;
- }
- int main() {
- //~ freopen("L.in", "r", stdin);
- if(scanf("%d",&n)>=1){
- forn(i,n-1){
- int p;scanf("%d",&p);--p;
- G[i+1].pb(p);
- G[p].pb(i+1);
- }
- getTopsort();
- //~ puts("TOPSORT:");
- //~ forn(i,topsort.size()){
- //~ printf("%d ",topsort[i].first+1);
- //~ }
- //~ puts("");
- vector<int> ans;
- for(ll d=1;d*d<=n;d++){
- if(n%d==0){
- if(d*d==n){
- if(check(d)){
- ans.pb(d);
- }
- } else {
- if(check(d)){
- ans.pb(n/d);
- }
- if(check(n/d)){
- ans.pb(d);
- }
- }
- }
- }
- sort(ans.begin(),ans.end());
- forn(i,ans.size()){
- if(i)printf(" ");
- printf("%d",ans[i]);
- }
- puts("");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement