题目描述

Description

Input

第一行两个个整数 n,k。

之后 n -1 行,第 i 行两个整数 ui, vi, 表示一条树边。

保证输入的数据构成一棵树。

Output

一行一个数表示答案。

Sample Input

Sample Input1

3 2

1 2

1 3

Sample Input2

10 367305945

1 2

2 3

2 4

3 5

2 6

5 7

1 8

4 9

1 10

Sample Output

Sample Output1

28

Explanation

1, 2, 3 : c = 3

1, 3, 2 : c = 3

2, 1, 3 : c = 2

2, 3, 1 : c = 2

3, 1, 2 : c = 1

3, 2, 1 : c = 1

Sample Output2

628657647

Data Constraint

题解

另一种做法:https://blog.csdn.net/qq_43649416/article/details/102925575

lj题解连状态都没给

orz cold_chair


如果能先确定那些点是黑点(好点),那么就有若干约束条件:

①白点要比第一个黑点祖先小

②黑点要比第一个黑点祖先大

两点间有边即两点间存在大小限制

20%可以暴力枚举黑点,然后把白点的限制容斥,变成比黑点祖先大与黑点祖先无大小限制,然后就可以变成一棵外向树+若干无关点的情况

具体来说,如果是比黑点祖先大的情况,那么相当于把白点变成黑点(不计算K的贡献)并单独提出来变为叶节点,并与原黑点祖先连边

因为若干白点与一个黑点有边时,白点之间没有大小限制,所以提出来作为叶节点

而且由于考虑的实际上是白点的贡献,所以不需要乘K

对于与黑点祖先无大小限制的情况,相当于直接把白点删掉

因为白点只与第一个黑点祖先有大小关系

外向树上的每个点都要比儿子小,所以一棵外向树的期望出现概率为∏1/size

这样就不用考虑具体的大小了


100%考虑用dp来实现上面的做法

设f[i][j],表示以i为根的子树,外向树大小为j的 (各种情况的贡献、外向树概率、容斥系数)的积 的和

显然j<=i,所以合并相当于O(n^2)树上背包

并且假设在i的祖先上有一个虚拟的黑点(因为具体的位置不重要)

就是把一坨东西合到一起,最终答案=∑f[root][j]

子树合并就直接对应相乘,考虑i的黑白情况

①i是黑点

那么i相当于把原来的虚拟黑点,i子树内的白点的边连向i

i则向i的祖先中的虚拟黑点连边,把K和外向树的概率算上

因为i是黑点,所以不需要容斥

f[i][j]*(1/(j+1))*K-->F[i][j+1]

②i是白点(i不为根)

考虑和虚拟黑点的连边,容斥一下变为 没有限制-比黑点祖先大 的情况

1、比黑点祖先大

等于把i变为叶子黑点,不用*K,子树大小为1所以不用乘外向树概率,容斥系数为-1

-f[i][j]-->F[i][j+1]

2、没有限制

等于把i删掉,容斥系数为1

f[i][j]-->F[i][j]

预处理1/x,O(n^2)dp即可

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define add(a,b) a=((a)+(b))%998244353
#define mod 998244353
using namespace std; int a[10001][2];
int ls[5001];
long long f[5001][5001];
long long F[5001];
int size[5001];
long long w[5001];
int n,i,j,k,l,len;
long long K,ans; void New(int x,int y)
{
++len;
a[len][0]=y;
a[len][1]=ls[x];
ls[x]=len;
} void dfs(int Fa,int t)
{
int i,j,k; f[t][0]=1;
size[t]=0; for (i=ls[t]; i; i=a[i][1])
if (a[i][0]!=Fa)
{
dfs(t,a[i][0]); fo(j,0,size[t])
{
fo(k,0,size[a[i][0]])
add(F[j+k],f[t][j]*f[a[i][0]][k]%mod);
} size[t]+=size[a[i][0]];
fo(j,0,size[t])
f[t][j]=F[j],F[j]=0;
} fo(j,0,size[t])
{
add(F[j+1],f[t][j]*K%mod*w[j+1]); //black if (t>1) //white
{
add(F[j],f[t][j]);
add(F[j+1],-f[t][j]);
}
} ++size[t];
fo(j,0,size[t])
f[t][j]=F[j],F[j]=0;
} int main()
{
freopen("random.in","r",stdin);
freopen("random.out","w",stdout); scanf("%d%lld",&n,&K);
w[1]=1;
fo(i,2,n)
{
w[i]=mod-w[mod%i]*(mod/i)%mod; scanf("%d%d",&j,&k); New(j,k);
New(k,j);
} dfs(0,1); fo(i,1,n) add(ans,f[1][i]);
fo(i,1,n) ans=ans*i%mod; printf("%lld\n",(ans+mod)%mod); fclose(stdin);
fclose(stdout); return 0;
}

6407. 【NOIP2019模拟11.05】小 D 与随机的更多相关文章

  1. 6423. 【NOIP2019模拟11.11】画

    题目描述 Description Input Output Sample Input 3 2 3 3 6 5 1 2 1 3 Sample Output 15 Data Constraint 题解 迫 ...

  2. 6402. 【NOIP2019模拟11.01】Cover(启发式合并)

    题目描述 Description 小 A 现在想用

  3. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有

  4. 6411. 【NOIP2019模拟11.06】上网

    题目描述 Description Input Output 若无解,则输出"Impossible". 否则第一行输出"Possible",第二行输出 n 个正整 ...

  5. 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)

    题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...

  6. jzoj6404. 【NOIP2019模拟11.04】B

    题目描述 Description Input 从文件b.in中读入数据. 第丬行三个正整数 n, m, K. 接下来 n 行每行 m 个正整数, 表示矩阵A. Output 输出到文件b.out中. ...

  7. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...

  8. JZOJ 3508. 【NOIP2013模拟11.5B组】好元素

    3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms  Mem ...

  9. ZROI提高组模拟赛05总结

    ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...

随机推荐

  1. Unity3D 旋转

    Unity有两种设置物体旋转的方式,一种时用Rotate()函数来旋转,另一种时直接构造目标Quaternion来直接赋予rotation. 好吧,不知到写什么,各种旋转和unity2D差不多.在国内 ...

  2. websocket服务器推送 (node+express+vue+socket)

    简介: 此项目需要懂一点node.express 功能: 1.前端用户登录,查看服务端推送的消息,用户只能在一个地方登录,也就是单点登录 2.服务端首先登录,上传需要推送的信息文本,后台读取文本后,存 ...

  3. python小游戏2

    import hashlib 过段时间会来解释下hashlib的源码(能力有限请大家谅解)#根据md5模块来加密密码 def pwd_md5(pwd): ''' 加密用户输入过来的密码 :param ...

  4. python 并发编程 同步调用和异步调用 回调函数

    提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...

  5. C语言作业Ⅰ12

    一.我学到的内容 二.我的收获 时间 作业链接 我的收获 第一周 https://www.cnblogs.com/deng9/p/11576196.html#4369234 让我对这个专业有了新的认识 ...

  6. Nginx配置与使用

    一.简单介绍 由俄罗斯程序员IgorSysoev研发,2004年开源公布,特点是:内存cpu占用低,并发能力强,稳定,配置示例,反向代理:互联网企业 70%以上公司都在使用 nginx: 二.安装 1 ...

  7. java使用face++简单实现人脸识别注册登录

    java使用face++简单实现人脸识别注册登录 前言 人脸识别,好高大上!!! 理解之后很简单. 支付宝使用的就是face++, 至于face++账号信息,apikey…..,本文不做讲述,网上很多 ...

  8. Kali安装在U盘+使用aircrack-ng套件

    因为: Kali Linux 自带aircrack-ng 虚拟机VMware不能用笔记本内置网卡,需要另外买一个无线网卡,然而并不想买 不想给笔记本重装Kali Linux系统 有闲置的32GU盘 所 ...

  9. phpstorm配合xdebug进行本地调试代码

    笔者在使用的环境是wamp3.1.6和phpstorm2018 ,php选择的环境是php7.2 1. 在php.ini中添加xdebug的配置信息 首先建议是先找对php.ini的位置,可以在php ...

  10. P1224 [NOI2013]向量内积

    传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...