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 }