哦,这个困惑了我好久的东西——生成函数(母函数),(然而拿这个东西去向学文化课的同学装逼并不成功。。。)
生成函数,就是把原来的加法组合变成乘法的指数加法,那么我们要求的值就是相应的指数的系数的值啦,是不是很神奇??(2333我好像又不会了。。)
那么这个题就是抑或规则下的生成函数(扒自某题解),把指数的加法变成抑或就可以。。
1 #include2 #define LL long long 3 using namespace std; 4 inline int ra() 5 { 6 int x=0,f=1; char ch=getchar(); 7 while (ch<'0' || ch>'9') { if (ch=='-') f=-1; ch=getchar();} 8 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 9 return x*f;10 }11 int n,cnt;12 int a[100005][505];13 int ans[512],head[100005],deep[100005];14 struct edge{15 int to,next;16 }e[100005];17 void insert(int x, int y){18 e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;19 }20 void dfs(int x)21 {22 a[x][0]=1;23 for (int i=head[x];i;i=e[i].next)24 {25 dfs(e[i].to);26 for (int j=0; j<=deep[x];j++)27 for (int k=0; k<=deep[e[i].to]; k++)28 ans[j^(k+1)]+=a[x][j]*a[e[i].to][k];29 deep[x]=max(deep[x],deep[e[i].to]+1);30 for (int j=0; j<=deep[e[i].to]; j++)31 a[x][j+1]+=a[e[i].to][j];32 }33 }34 int main(int argc, char const *argv[])35 {36 n=ra();37 for (int i=2; i<=n; i++)38 insert(ra(),i);39 dfs(1); int mx=512;40 for (; mx ; mx--) if (ans[mx]) break;41 for (int i=0; i<=mx; i++) printf("%d\n",ans[i]);42 return 0;43 }