zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
    42     return 0;
    43 }
  • 相关阅读:
    Redis 客户端连接
    Redis 性能测试
    Redis 安全
    Redis 数据备份与恢复
    Redis 数据类型
    Redis 配置
    Redis 安装
    Redis 简介
    Redis教程
    如何修改Oracle Enterprise Linux时区?
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6512022.html
Copyright © 2011-2022 走看看