bzoj 3696: 化合物

哦,这个困惑了我好久的东西——生成函数(母函数),(然而拿这个东西去向学文化课的同学装逼并不成功。。。)

生成函数,就是把原来的加法组合变成乘法的指数加法,那么我们要求的值就是相应的指数的系数的值啦,是不是很神奇??(2333我好像又不会了。。)

那么这个题就是抑或规则下的生成函数(扒自某题解),把指数的加法变成抑或就可以。。

 1 #include <bits/stdc++.h>
 2 #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 }

 

posted @ 2017-03-06 21:18  ws_ccd  阅读(289)  评论(0编辑  收藏  举报