#include<cstdio> inlinecharnc(){ staticchar buf[100000],*l=buf,*r=buf; return l==r&&(r=(l=buf)+fread(buf,1,100000,stdin),l==r)?EOF:*l++; } inlineintred(){ int res=0,f=1;char ch=nc(); while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();} while ('0'<=ch&&ch<='9') res=res*10+ch-48,ch=nc(); return res*f; }
constint maxn=1000005,maxe=2000005; int n,siz[maxn],s[maxn]; int tot,son[maxe],nxt[maxe],lnk[maxn]; inlinevoidadd(int x,int y){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot; } voiddfs(int x,int fa){ siz[x]=1; for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=fa){ dfs(son[j],x); siz[x]+=siz[son[j]]; } } boolcheck(int x){ int tot=0; for (int i=x;i<=n;i+=x) tot+=s[i]; return tot==n/x; } intmain(){ n=red(); for (int i=1,x,y;i<n;i++) x=red(),y=red(),add(x,y),add(y,x); dfs(1,1); for (int i=1;i<=n;i++) s[siz[i]]++; int ans=0; for (int d=1;d*d<=n;d++) if (n%d==0){ if (check(d)) ans++; if (d*d!=n&&check(n/d)) ans++; } printf("%d",ans); return0; }