当前位置: 首页 > news >正文

整体思想以及取模

前言:一开始由于失误,误以为分数相加取模不能,但是其实是可以取模的

这个题目如果按照一般方法,到达每个节点再进行概率统计,但是不知道为什么只过了百分之十五的测试集


题目地址
在这里插入图片描述

附上没过关的代码

#include<bits/stdc++.h>
using namespace std;#define int long longint n; int ans = 0;
const int N = (int)2e6 + 5;
const int Mod = 998244353;
int e[N], ne[N], h[N / 2], idx = 0;
void add(int a, int b) {e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}int qw(int x, int p) {int temp = 1;while (p) {if(p&1)temp = x * temp % Mod;x = x * x % Mod;p >>= 1;}return temp;
}void dfs(int u, int fa, int g, int step) {int cnt = 0;for (int i = h[u]; i; i = ne[i]) {int v = e[i]; if (fa == v) continue;cnt++;}if (cnt == 0) {// 已经是子节点了 //ans = (ans + (step % Mod) * qw(g, Mod - 2)) % Mod; return;ans = (ans + step*g%Mod) % Mod; return;}g = (g % Mod) * (qw(cnt, Mod - 2) % Mod) % Mod;for (int i = h[u]; i; i = ne[i]) {int v = e[i]; if (fa == v) continue;dfs(v, u, g , step + 1);}
}signed main() {cin >> n;for(int i=1;i<n;i++){int u,v; cin >> u >> v;add(u,v),add(v,u);}if(n==1){cout << 0 ; return 0;}dfs(1,0,1,0);cout << ans;return 0;
}

再写一个过关的,按照官方答案的解法的

#include<bits/stdc++.h>
using namespace std;#define int long longint n; int ans = 0;
const int N = (int)2e6 + 5;
const int Mod = 998244353;
const int P = 998244353;
int e[N], ne[N], h[N / 2], idx = 0;
vector<int> a[N / 2];
int siz[N], ye[N]; // 记录每一层的节点个数以及叶子节点的个数 
void add(int a, int b) {e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}int qw(int x, int p) {int temp = 1;while (p) {if (p & 1)temp = x * temp % Mod;x = x * x % Mod;p >>= 1;}return temp;
}void dfs(int u, int fa, int dep) {int cnt = 0; siz[dep]++;for (int i = h[u]; i; i = ne[i]) {int to = e[i]; if (to == fa) continue;cnt++; dfs(to, u, dep + 1);}if (cnt == 0) {ye[dep]++;}
}void solve() {int pre = 1; // 概率for (int i = 1; i < n; i++) {//cout << " siz " << i << " " << ye[i] << endl;if (siz[i] == 0) break;//ans = (ans+(pre*(ye[i]*(qw(siz[i],Mod-2),Mod-2)%Mod)%Mod) * (i)%Mod) % Mod;ans = (ans + pre * ye[i] % P * qw(siz[i], P - 2) % P * (i) % P) % P;pre = pre * ((siz[i] - ye[i]) * (qw(siz[i], Mod - 2)) % Mod)%Mod;//pre = pre * (((siz[i] - ye[i]) % P + P) % P) % P * qw(siz[i], P - 2) % P;}cout << ans; return;
}signed main() {cin >> n;for (int i = 1; i < n; i++) {int u, v; cin >> u >> v;add(u, v), add(v, u);//a[u].push_back(v); a[v].push_back(u);}if (n == 1) {cout << 0; return 0;}dfs(1, 0, 0);solve();return 0;
}

相关文章:

  • Spring @Async注解【总结记录】
  • 点对点专线的带宽管理和控制功能解析
  • 【AI趋势9】开源普惠
  • c语言练习题1
  • APP 整改要求 “未清晰明示高德SDK处理IP地址、SSID、BSSID的目的、方式和范围。”
  • 【QT】——1_QT学习笔记
  • 学懂C++(三十九):网络编程——深入详解 TCP 和 UDP 的区别和应用场景
  • Moodle与ONLYOFFICE集成如何实现智能教学管理
  • python中dataframe的iloc和loc的使用区别
  • 秋叶SD整合安装包更新了!8月最新版4.9【附下载】
  • Qt 0821作业
  • 用友crm客户关系管理help.php存在任意文件读取漏洞解析
  • 面试题目:(6)翻转二叉树
  • 机器学习十-欠拟合和过拟合
  • JavaScript - 事件监听
  • 03Go 类型总结
  • 77. Combinations
  • JAVA_NIO系列——Channel和Buffer详解
  • js ES6 求数组的交集,并集,还有差集
  • JS学习笔记——闭包
  • NSTimer学习笔记
  • PAT A1017 优先队列
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue-router 实现分析
  • 半理解系列--Promise的进化史
  • 构建二叉树进行数值数组的去重及优化
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 由插件封装引出的一丢丢思考
  • 在Mac OS X上安装 Ruby运行环境
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #### golang中【堆】的使用及底层 ####
  • #APPINVENTOR学习记录
  • #LLM入门|Prompt#3.3_存储_Memory
  • (06)金属布线——为半导体注入生命的连接
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)STL算法之比较
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (纯JS)图片裁剪
  • (独孤九剑)--文件系统
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (六)激光线扫描-三维重建
  • (十)c52学习之旅-定时器实验
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .bat批处理出现中文乱码的情况
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core中Emit的使用
  • .net MySql
  • .NET Reactor简单使用教程
  • .Net 高效开发之不可错过的实用工具
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 流——流的类型体系简单介绍
  • .net 受管制代码
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)