hdu5909-Tree Cutting【FWT】
正题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5909
题目大意
给出\(n\)和\(m\)(\(m=2^k\))。再给出一个大小为\(n\)的树,每个点有点权,对于每个\(i\in[1,m)\)求有多少个联通子图的点权异或和为\(i\)
\(1\leq T\leq 10,1\leq n\leq 1000,1\leq m\leq 2^{10}\)
解题思路
设\(f_{i,j}\)表示\(i\)的子树中包含\(i\)的联通子图里面,异或和为\(j\)的有多少个。那么转移方程就是
\]
这个是裸的\(FWT\)形式,所以直接做就好了
时间复杂度\(O(n^2\log m)\)
比较老的题库了,输出格式限制是真的很严格
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1030,P=1e9+7,inv2=(P+1)/2;
struct node{
ll to,next;
}a[N<<1];
ll T,n,m,tot,ls[N],v[N];
ll f[N][N],ans[N];
void addl(ll x,ll y){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;return;
}
void FWT(ll *f,ll op){
for(ll p=2;p<=m;p<<=1)
for(ll k=0,len=p>>1;k<m;k+=p)
for(ll i=k;i<k+len;i++){
ll x=f[i],y=f[i+len];
f[i]=(x+y)*op%P;
f[i+len]=(x-y)*op%P;
}
return;
}
void dfs(ll x,ll fa){
f[x][v[x]]=1;FWT(f[x],1);
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(y==fa)continue;
dfs(y,x);
for(ll j=0;j<m;j++)
f[x][j]=f[x][j]*f[y][j]%P;
}
FWT(f[x],inv2);
for(ll j=0;j<m;j++)
(ans[j]+=f[x][j])%=P;
f[x][0]++;FWT(f[x],1);
return;
}
signed main()
{
scanf("%lld",&T);
while(T--){
memset(ans,0,sizeof(ans));
memset(ls,0,sizeof(ls));
memset(f,0,sizeof(f));tot=0;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
scanf("%lld",&v[i]);
for(ll i=1;i<n;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
addl(x,y);addl(y,x);
}
dfs(1,1);
for(ll i=0;i<m;i++){
printf("%lld",(ans[i]%P+P)%P);
if(i!=m-1)putchar(' ');
}
putchar('\n');
}
return 0;
}
hdu5909-Tree Cutting【FWT】的更多相关文章
- hdu5909 Tree Cutting 【树形dp + FWT】
题目链接 hdu5909 题解 设\(f[i][j]\)表示以\(i\)为根的子树,\(i\)一定取,剩余节点必须联通,异或和为\(j\)的方案数 初始化\(f[i][val[i]] = 1\) 枚举 ...
- 【HDU5909】Tree Cutting(FWT)
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...
- HDU 5909 Tree Cutting(FWT+树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5909 [题目大意] 给出一棵树,其每棵连通子树的价值为其点权的xor和, 问有多少连通子树的价值为 ...
- hdu5909 Tree Cutting
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5909 [题解] 设$f_{x,i}$表示以$x$节点的子树中,权值为$i$的子树个数,其中$x$必选. ...
- HDU5909 Tree Cutting(树形DP + FWT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T with n ve ...
- PAT甲级1135 Is It A Red-Black Tree?【dfs】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 题意: 给定一棵二叉搜索树的先序遍历结 ...
- Extjs中创建Tree菜单【一】
此篇treepanel的描写是很简单,没有太大的难度,在学习时,可以先熟悉tree的一些配置信息.属性.方法和事件. 然后先写一个简单的例子,慢慢了解从中如何实现的,然后在慢慢的深入了解,实现一些复杂 ...
- [dts]Device Tree机制【转】
转自:https://www.cnblogs.com/aaronLinux/p/5496559.html 转自:http://blog.csdn.net/machiner1/article/detai ...
- LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】
题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...
随机推荐
- mfc HackerTools远程线程注入
在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程).创建的线程一般为Windows API函 ...
- Javascript - Vue - webpack中的axios
导入axios import Vue from "vue";import axios from "axios";import { get } from &quo ...
- 工作效率:通过pycharm的模板代码减少重复工作
摘要 在常见的业务开发场景下,经常要开发大量重复的代码,这里代码耗时但又必要,就像我们写分析报告一样,每次都要为固定的格式耗费精力.我们可以更加日常开发经验总结出一些常用的模板代码来帮助我们实现一秒五 ...
- springboot开启矩阵传参MatrixVariable
/** * 根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对. * 规范中没对对应的术语.一般 "URL 路径参数" 可以被应用,尽管更加 ...
- Ubuntu16.04 Linux 下安装、配置SSH
本人在Win7+VMware下利用两个ubuntu虚拟机安装.配置.测试了SSH. 在Server端安装openssh-server. sudo apt-get install ssh # 安装ssh ...
- 巧用模糊实现视觉的 3D 效果
本文较短,将介绍巧用模糊实现视觉 3D 效果的技巧. 我们都知道,在正常的视觉效果中,离我们越近的通常我们会看的越清晰,而离我们较远则相对没那么清晰~ 我们可以利用清晰与模糊两种状态来构建视差效果.像 ...
- Android kotlin http url request
kotlin.concurrent.thread{ val url = "https://hangj.cnblogs.com/" val res = try { java.net. ...
- 移动端ios上下滑动翻页事件失效
移动端开发过程中,在添加上下滑动事件时候,引入了最常用的移动端库zepto.js及其touch模块,有一种现象,安卓的手机没有问题,上下滑动翻页很正常 :但是到了ios上面,好啊,上下滑动会出现弹性滚 ...
- MySQL——日志管理
一.MySQL日志类型 1.错误:--log--error ---------------------*** host_name.err 2.常规: --general_log host_name.l ...
- python类、继承
Python 是一种面向对象的编程语言.Python 中的几乎所有东西都是对象,拥有属性和方法.类(Class)类似对象构造函数,或者是用于创建对象的"蓝图". 一.python ...