1 //fwt优化+树形DP HDU 5909
 2 //见官方题解
 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/
 4
 5 #include <bits/stdc++.h>
 6 // #include <iostream>
 7 // #include <cstdio>
 8 // #include <cstdlib>
 9 // #include <algorithm>
10 // #include <vector>
11 // #include <queue>
12 // #include <math.h>
13 using namespace std;
14 #define LL long long
15 typedef pair<int,int> pii;
16 const int inf = 0x3f3f3f3f;
17 const int MOD =1e9+7;
18 const int N =1e3+50;
19 #define clc(a,b) memset(a,b,sizeof(a))
20 const double eps = 1e-8;
21 void fre() {freopen("in.txt","r",stdin);}
22 void freout() {freopen("out.txt","w",stdout);}
23 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
24 const int rev = (MOD+1)>>1;
25 int a[N],tem[N];
26 int n,m;
27 vector<int> g[N];
28 int dp[N][N];
29 int ans[N];
30 void FWT(int *a,int n)  {
31     for(int d=1; d<n; d<<=1)
32         for(int m=d<<1,i=0; i<n; i+=m)
33             for(int j=0; j<d; j++)  {
34                 int x=a[i+j],y=a[i+j+d];
35                 a[i+j]=(x+y)%MOD,a[i+j+d]=(x-y+MOD)%MOD;
36             }
37 }
38
39 void UFWT(int *a,int n)  {
40     for(int d=1; d<n; d<<=1)
41         for(int m=d<<1,i=0; i<n; i+=m)
42             for(int j=0; j<d; j++) {
43                 int x=a[i+j],y=a[i+j+d];
44                 a[i+j]=1LL*(x+y)*rev%MOD,a[i+j+d]=(1LL*(x-y)*rev%MOD+MOD)%MOD;
45             }
46 }
47
48 void solve(int *a,int *b,int n)  {
49     FWT(a,n);
50     FWT(b,n);
51     for(int i=0; i<n; i++)   a[i]=1LL*a[i]*b[i]%MOD;
52     UFWT(a,n);
53 }
54
55 void dfs(int u,int f){
56     dp[u][a[u]]=1;
57     for(int i=0;i<(int)g[u].size();i++){
58         int v=g[u][i];
59         if(v==f) continue;
60         dfs(v,u);
61         for(int j=0;j<m;j++) tem[j]=dp[u][j];
62         solve(dp[u],dp[v],m);
63         for(int j=0;j<m;j++) dp[u][j]=(dp[u][j]+tem[j])%MOD;
64     }
65     for(int i=0;i<m;i++) ans[i]=(ans[i]+dp[u][i])%MOD;
66 }
67 int main(){
68     // fre();
69     int T;
70     scanf("%d",&T);
71     while(T--){
72         clc(dp,0);
73         clc(ans,0);
74         scanf("%d%d",&n,&m);
75         for(int i=1;i<=n;i++) {
76             scanf("%d",&a[i]);
77             g[i].clear();
78         }
79         for(int i=1;i<=n-1;i++){
80             int u,v;
81             scanf("%d%d",&u,&v);
82             g[u].push_back(v);
83             g[v].push_back(u);
84         }
85         dfs(1,0);
86         for(int i=0;i<m;i++){
87             printf("%d%c",ans[i],i==m-1 ? '\n':' ');
88         }
89     }
90     return 0;
91 }

转载于:https://www.cnblogs.com/ITUPC/p/5929299.html

fwt优化+树形DP HDU 5909相关推荐

  1. 长链剖分优化树形dp

    apio铁牌告辞(开场想打暴力然后gedit码代码5个小时没写完三题最低档暴力真是快乐),听课也就学到了一丢丢这个东西. 模板题: https://www.luogu.org/problemnew/s ...

  2. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

  3. 中心城镇问题(长链剖分优化树形dp)

    problem 给定 nnn 个城市,n−1n-1n−1 条道路,形成一棵树.每座城市上的人口为 wiw_iwi​. 现要修建若干个中心城镇,满足任意两个中心城镇之间的距离严格大于 kkk. 最大化中 ...

  4. 2021牛客多校6 - Gambling Monster(分治FWT优化期望dp)

    题目链接:点击查看 题目大意:有一个转盘,每次转动得到 0∼n−10\sim n−10∼n−1(nnn 是 2 的幂)的概率分别给出.最开始你有一个数 x=0x=0x=0,每次转动转盘得到一个数 yy ...

  5. HDU.5909.Tree Cutting(树形DP FWT/点分治)

    题目链接 \(Description\) 给定一棵树,每个点有权值,在\([0,m-1]\)之间.求异或和为\(0,1,...,m-1\)的非空连通块各有多少个. \(n\leq 1000,m\leq ...

  6. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  7. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  8. HDU 1520 Anniversary party(树形dp)

    HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...

  9. hdu 1561 The more, The Better 树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 做树形dp比较小. 先上网学习下,总结下套路. dp[i][j]表示在第i个节点,有j个名额选的时候的最大 ...

最新文章

  1. 【控制】麦克纳姆轮 Mecanum 小车模型分析
  2. 不忘每份支持,网易云信感谢一路有你
  3. 数学沉思录:古今数学思想的发展与演变 (Mario Livio 著)
  4. C++:04---内联函数
  5. pdb断点命令_Python使用pdb更优雅的调试代码
  6. 客户网站被黑导致CDN加速后打开域名就提示域名纠错
  7. python基础知识-python基础知识总结
  8. 2020idea插件怎么同步_暴击单身狗,异地情侣居然靠一款插件同步追剧!
  9. 海南航空宁波到重庆的变态机票
  10. 由数据库连接池想到的----处理他人未释放的资源
  11. Halcon的一维码和二维码解码步骤和技巧
  12. SLAM算法 - 3D激光匹配算法
  13. SRCNN 图像超分辨率重建(tf2)
  14. 微信小程序蓝牙打印开发心得
  15. 如何删除双系统中的ubuntu系统
  16. 解决mac压缩包在windows下解压乱码问题。
  17. Local Maximum Mean Discrepancy
  18. 海洋磁力数据处理步骤
  19. python 冒泡排序 交换次数_(Python)交换排序(气泡排序、快速排序),冒泡排序...
  20. Scratch精通之列表的使用

热门文章

  1. usaco Combination Lock
  2. oracle重启一个节点集群,帮忙分析一例数据库两节点集群每隔几个月节点重启
  3. 单片机c语言实现表格数据调用,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  4. 康复治疗学可以考计算机吗,【大揭秘】2018“人机对话”康复医学治疗技术专业技术资格考试...
  5. android qq第三方登录,Android调用第三方QQ登录代码分享
  6. linux 毫秒 转换方法,linux-将抖动转换为毫秒
  7. 缓存成神路:Redis读写分离难以理解?一文解析Redis读写分离技术
  8. Python Qt GUI设计:QScrollBar类实现窗口水平或垂直滑动条效果(拓展篇—4)
  9. 【深度学习理论】(1) 损失函数
  10. 【MediaPipe】(2) AI视觉,人体姿态关键点实时跟踪,附python完整代码