6407. 【NOIP2019模拟11.05】小 D 与随机
题目描述
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 与随机的更多相关文章
- 6423. 【NOIP2019模拟11.11】画
题目描述 Description Input Output Sample Input 3 2 3 3 6 5 1 2 1 3 Sample Output 15 Data Constraint 题解 迫 ...
- 6402. 【NOIP2019模拟11.01】Cover(启发式合并)
题目描述 Description 小 A 现在想用
- 【NOIP2019模拟11.01】Game(贪心+线段树)
Description: 小 A 和小 B 在玩一个游戏,他们两个人每人有
- 6411. 【NOIP2019模拟11.06】上网
题目描述 Description Input Output 若无解,则输出"Impossible". 否则第一行输出"Possible",第二行输出 n 个正整 ...
- 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)
题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...
- jzoj6404. 【NOIP2019模拟11.04】B
题目描述 Description Input 从文件b.in中读入数据. 第丬行三个正整数 n, m, K. 接下来 n 行每行 m 个正整数, 表示矩阵A. Output 输出到文件b.out中. ...
- JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C
3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ...
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
随机推荐
- 对MPU6050坐标矩阵修改的学习
MPU6050是根据三轴陀螺仪和三轴加速度计数据通过DMP运算的出欧拉角.系统默认为水平放置, 但是实际使用过程中并不都是水平放置,有些特殊的场合,要求芯片竖直放置,这时候就不得 不修改MPU6050 ...
- H3C版本升级
H3C S5500和S3100都可以通过TFTP方式进行升级,1.设置交换机的vlan1的ip地址,如10.10.10.2/242.设置电脑和交换机连接的ip地址,如10.10.10.1/243.在交 ...
- gitlab ssh 免密登录
打开本地git 使用 ssh-keygen 工具 输入命令 ssh-keygen -t rsa -C '你的邮箱账号' 接下来输入密码 确认密码 找到目录 找到公钥 在 gitlab 用户设置 ...
- 【HTTP】二、HTTP协议的报文结构
HTTP有两类报文:请求报文和响应报文,由于 HTTP 是面向正文的(text-oriented),因此在报文中的每一个字段都是一些 ASCII码串,因而每个字段的长度都是不确定的.(HTTP2引 ...
- Python密码登录程序的思考--学与习
# 初学者的起步,对于开始的流程图结构还不太熟悉 # 思考: 1,write()与writelines()的区别,前者确定为字符串,后者为序列(列表,字典.元组等),自动为你迭代输入# ...
- JS 截取字符的方法
substr() 方法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的 ...
- [转帖]Spring Cloud底层原理
拜托!面试不要再问我Spring Cloud底层原理 https://mp.weixin.qq.com/s/ZH-3JK90mhnJPfdsYH2yDA 毫无疑问,Spring Cloud 是目前微服 ...
- SpringBoot自动化配置之二:自动配置(AutoConfigure)原理、EnableAutoConfiguration、condition
自动配置绝对算得上是Spring Boot的最大亮点,完美的展示了CoC约定优于配置: Spring Boot能自动配置Spring各种子项目(Spring MVC, Spring Security, ...
- c++中的四种智能指针
c++中的四种智能指针 写惯了python,golang再来写c++总觉得头大,很大一个原因就是他没有一个GC机制. 不过c++中提供了智能指针,也不是不能用,李姐万岁! auto_ptr, shar ...
- 面试mysql表设计要注意啥
面试官:讲讲mysql表设计要注意啥? 引言 大家应该知道烟哥最近要(tiao 咳咳咳),嗯,不可描述! 随手讲其中一部分知识,都是一些烟哥自己平时工作的总结以及经验.大家看完,其实能避开很多坑.而且 ...