Description

Input

Output

Sample Input

Sample Input1
3 1
1 1 1
1 2
2 3 Sample Input2
9 4
0 0 1 4 1 2 0 4 7
1 2
2 5
3 1
3 4
2 6
4 8
3 7
8 9

Sample Output

Sample Output1
499122177 【输入输出样例 1 说明】
断掉第 1, 2 条边或者只断第 1 条边均可恰好获得 1 朵花朵,这两种情况的概率的和为 0.5。 Sample Output2
967049217

Data Constraint

Solution

树形依赖背包。

选当前这个点必须先选父亲节点。

考虑设f[ i ][ j ]表示第i个点与第1个点联通并且总和为j的概率。

递归之前将父亲的f转移到儿子上,以便兄弟节点背包时用,递归完后再统计到父亲节点上。

两种考虑方式,

法一:

递归前,考虑当前这条父亲与儿子的边必选要选。

f[ son ][ j ]=f[ x ][ j-a[ son ] ] * 1/2

递归后,两种情况,

选当前这条边,那么就是f[ son ][ j ](已经乘了概率了),

不选,就是f[ x ][ j ] *1/2

初值f[ 1 ][ a[ 1 ] ]=1

法二:

先将1节点的儿子全部砍掉,则有:

初值f[ 1 ][ a[ 1 ] ]=(1/2)^k(k为1节点的儿子数)

递归前,父亲转移到儿子时,当前边要必选(可视为在父亲节点割掉所有儿子节点的边时已经计算过)

然后再割掉儿子的所有儿子节点的边。

f[ son ][ j ]=f[ x ][ j- a[ son ] ]*(1/2)^k(k为son的儿子数)

递归后,直接加上即可。

f[ x ][ j ]= f[ x ][ j ]+f[ son ][ j ]

Code1

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
#define N 5005
#define M 998244353
using namespace std;
I n,m,x,y,f[N][N],a[N],t[N<<1],nx[N<<1],ls[N],tot,e=499122177;
void R(I &x){x=0;I w=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=w;
}
void add(I x,I y){t[++tot]=y,nx[tot]=ls[x],ls[x]=tot;}
void dg(I x,I y){for(I k=ls[x];k;k=nx[k]) if(t[k]!=y){Fd(j,m,a[t[k]]){f[t[k]][j]=(ll)f[x][j-a[t[k]]]*e%M;}dg(t[k],x);F(j,1,m) f[x][j]=((ll)f[x][j]*e+f[t[k]][j])%M;}
}
I main(){freopen("luge.in","r",stdin);freopen("luge.out","w",stdout);R(n),R(m);F(i,1,n) R(a[i]);F(i,1,n-1){R(x),R(y);add(x,y),add(y,x);}f[1][a[1]]=1;dg(1,0);printf("%d\n",f[1][m]);return 0;
}

Code2

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
#define N 5005
#define M 998244353
using namespace std;
I n,m,x,y,d[N],g[N],f[N][N],a[N],t[N<<1],nx[N<<1],ls[N],tot;
void R(I &x){x=0;I w=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=w;
}
void add(I x,I y){t[++tot]=y,nx[tot]=ls[x],ls[x]=tot;}
void dg(I x,I y){for(I k=ls[x];k;k=nx[k]) if(t[k]!=y){Fd(j,m,a[t[k]]){f[t[k]][j]=(ll)f[x][j-a[t[k]]]*g[d[t[k]]]%M;}dg(t[k],x);F(j,1,m) f[x][j]=((ll)f[x][j]+f[t[k]][j])%M;}
}
I main(){freopen("luge.in","r",stdin);freopen("luge.out","w",stdout);R(n),R(m);F(i,1,n) R(a[i]);F(i,1,n-1){R(x),R(y);add(x,y),add(y,x);}g[g[0]=1]=499122177;F(i,2,n) g[i]=(ll)g[i-1]*g[1]%M;F(i,1,n){for(I k=ls[i];k;k=nx[k]) d[i]++;if(i>1) d[i]--;}f[1][a[1]]=g[d[1]];dg(1,0);printf("%d\n",f[1][m]);return 0;
}

6810. 【2020.10.05提高组模拟】路哥相关推荐

  1. JZOJ6828. 【2020.10.25提高组模拟】幂

    Description TTT组数据,T≤1e5,n≤1e7T\le1e5,n\le1e7T≤1e5,n≤1e7 Solution 好家伙,最下面的数据范围居然是这样的: 直接以为卡特兰数乘上个组合数 ...

  2. 6848. 【2020.11.03提高组模拟】融入社会的计划

    Description Input Output 一行一个整数表示答案. upd:  无解输出-1. Sample Input Sample Input1 6 6 13 11 1 1 4 5 5 Sa ...

  3. jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】

    正题 题目大意 开始暴击率为xxx,每次失败后都会增加xxx,成功后重置,然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ans ...

  4. 6846. 【2020.11.02提高组模拟】旅人1970

    Description Input Output Sample Input Sample Input1 25 4 4 1 2 3 2 1 1 1 2 Sample Output Sample Outp ...

  5. gmoj 6860. 【2020.11.14提高组模拟】鬼渊传说

    题目 Time Limits: 1000 ms Memory Limits: 518400 KB 简要题意 给出一个网格图,每个格子有黑白二色,求有多少个子矩形满足将其挖出来后恰好有一个黑色四连通块且 ...

  6. jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】

    正题 题目大意 n∗nn*nn∗n的矩形,每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上.如果没有就失败了,求必胜方. 解题思路 如果场地上有一个位置堵上后即可堵上所有 ...

  7. 【2020.11.30提高组模拟】剪辣椒(chilli)

    剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...

  8. 【2020.12.03提高组模拟】袋鼠

    题目 题目描述 你知道吗?乌拉圭的人口有345.7万,同时,仅澳大利亚就有4700万只袋鼠. 袋鼠决定入侵乌拉圭.袋鼠们将在平原上布阵,平原被划分成 n×mn \times mn×m 的网格. 每个格 ...

  9. JZOJ6893. 【2020.11.25提高组模拟】小 T 与灵石(stone)题解

    这道题需要转化,换根和卡常. 首先将集合中的点拉出来,找它们的直径 不需要什么虚树,随便挑一个集合里的点为根,做一遍dfs,找最远点x(要在集合里),以x为根重复以上操作,找到最远点y,x-y就是题解 ...

最新文章

  1. android 切换 preferencefragment,Android PreferenceActivity与PreferenceFragment详解及简单实例_Android_脚本之家...
  2. Leetcode215数组中第k大的数-最小堆
  3. 【学习笔记】利润中心会计初识
  4. 计算机的登入灯出操作系统,为什么计算机不能像电灯一样瞬时打开?
  5. ASP+AJAX制作无刷新新闻评论系统01
  6. 大数据系统应包含哪些功能模块
  7. java普通md5加密解密_java 采用MD5加密解密
  8. error CS1010 CS8025 CS1012 CS1525 常见文档错误解决
  9. python 字体颜色_Python字体颜色设置
  10. php根据经纬度获取地理位置
  11. cf黑机器多久解除_CF永久解除机器码|CF机器码硬解封详细步骤教程+工具|CF辅助-QQ知啦娱乐网...
  12. 设备管理 设备控制方式
  13. oracle的多个exclude,记录一下expdp exclude的用法
  14. 【云原生】SpringCloud系列之服务调用OpenFeign(基本概念和使用步骤)
  15. Codeforces Round #499 (Div. 2) 1011 C. Fly 二分
  16. 万字详解什么是生成对抗网络GAN
  17. vue路由详解 --基础
  18. 同相放大器、反相放大器的区别与优劣
  19. 京东区块链开源底层JD Chain版本升级,获工信部功能测试证书
  20. Linux的一些简单命令操作,好懂易学(1)

热门文章

  1. 使用while循环方式打印100以内4的倍数(while中加if)、使用while循环方式计算2+4+6+8+...+100、编写程序“从键盘读入个数不正确的整数,并判断读入的正数和负数的个数
  2. php date not safe,PHP date()函数警告: It is not safe to rely on the system解决方法
  3. 房屋认购书签订应谨慎(转)
  4. android上消息推送的实现
  5. windowsXP日常应用技巧及经验总结
  6. 12306 订票助手 1.3
  7. Camera和Image sensor技术基础笔记(5) -- HDR相关技术
  8. 1一10到时的英文单词_1到100的英语单词
  9. Ubuntu18.04 工控机接USB无线网卡无法连网问题解决办法
  10. iphone图片编辑画笔_ios13照片编辑画笔在哪里