题意:
把一棵树分成几块,使得每个块中的点数都相同的方案数。
题解:
好题,起码我不会
orz
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct node{
int y,next;
}a[2000010];int len=0,last[1000010];
int n,tot[1000010],cnt[1000010];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void ins(int x,int y)
{
a[++len].y=y;
a[len].next=last[x];last[x]=len;
}
void dfs(int x,int fa)
{
tot[x]=1;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(y==fa) continue;
dfs(y,x);tot[x]+=tot[y];
}
}
int main()
{
n=read();
for(int i=1;i<n;i++)
{
int x,y;x=read();y=read();
ins(x,y);ins(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++) cnt[tot[i]]++;
int ans=0;
for(int i=1;i<=n;i++)
{
if(n%i!=0) continue;
int t=0;
for(int j=1;j<=n/i;j++) t+=cnt[i*j];
ans+=(t==n/i);
}
printf("%d",ans);
}