当前位置: 首页 > 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;
}
http://www.lryc.cn/news/428855.html

相关文章:

  • RabbitMQ 消息可靠保障
  • Redis 作为 PHP 的会话存储
  • 基于伏图的数字心脏模拟仿真APP应用介绍
  • 智云-一个抓取web流量的轻量级蜜罐docker一键启动
  • 原生HTML5、CSS、JavaScript实现简易网易云音乐播放
  • 网上商城小程序的设计
  • 微分方程(Blanchard Differential Equations 4th)中文版Section2.2
  • Swift 环境搭建
  • 科技与出版
  • 5年前端面试之路
  • 产品运营(一)--产品运营是什么?
  • 学习大数据DAY41 Hive 分区表创建
  • 【三维目标检测模型】ImVoteNet
  • 力扣 | 背包dp | 279. 完全平方数、518. 零钱兑换 II、474. 一和零、377. 组合总和 Ⅳ
  • 【ECMAScript性能优化的技巧与陷阱】
  • Swift实时监听判断是否连接有网络WIFI和蜂窝数据
  • (三)Flink Source 数据源
  • 第四届机电一体化、自动化与智能控制国际学术会议(MAIC 2024)
  • leetcode 089 打家劫舍
  • 等保测评基础知识(六)
  • 作业帮 TiDB 7.5.x 使用经验
  • c语言练习题1
  • 嵌入式开发就业方向有哪些?前景未来可期!
  • 系列:水果甜度个人手持设备检测-github等开源库和方案
  • Visual Studio中 生成版本号
  • AI入门指南(四):分类问题、回归问题、监督、半监督、无监督学习是什么?
  • Linux下本地端口转发
  • RPC 和 HTTP 理解
  • Visual Studio 2022 v17.11 发布
  • 通讯专题-RS232