Codeforces Round 896 (Div. 1) C. Travel Plan(树形dp+组合数学)

题目

有一棵n(1<=n<=1e18)个点的树,

点i连着2*i和2*i+1两个点,构成一棵完全二叉树

对于每个点i,记其值为a[i],a[i]可以取[1,m](1<=m<=1e5)的整数

记i到j的简单路径上的最大值为s[i][j],

则一棵权值确定的树对答案的贡献是\sum_{i=1}^{n}\sum_{j=i+1}^{n}s[i][j]

现在求所有可能情况下的树的贡献之和,答案对998244353取模

实际t<=200组样例,但保证summ不超过1e5

思路来源

羊村群小羊

题解

大致的思路就是把每个长度的路径都统计算出来,然后再算贡献

而n个点的树总是可以拆成左子树和右子树继续递归下去的,有子结构的概念

所以可以按子树大小做记忆化,每棵子树暴力维护所有长度的路径进行合并

由于路径长度最长2*logn,这里固定开了128长度的vector,只对这些做合并

dp[i][2]表示当前节点u的子树长度为i的路径的条数

其中dp[i][0]表示两端都位于子树内部的路径,dp[i][1]表示有一端位于根节点的路径

求出路径方案数后求贡献,最大值为i的方案数,首先特判i=1,

然后稍作容斥,方案数等于m个值从[1,i]任取减去m个值从[1,i-1]任取

长为i的路径的方案数*剩下n-i个点任取的方案数*最大值为j的方案数*最大值j,

就是当路径长度为i,而最大值为j时,(i,j)对答案的贡献,统计所有贡献累加即可

心得

int k = std::__lg(n + 1);
ll ls=((1LL << (k - 1)) - 1) + std::min(1LL << (k - 1), n - (1LL << k) + 1);
ll rs=n-1-ls;

求左子树大小这里,抄了一下jiangly的代码,但后来想了想也很好理解

对于倒数第二层往上,是左右子树平分的

而对于最后一层,左子树能拿到的大小,为min(剩下的点数,最后一层的一半)

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef array<int,2> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef unsigned ui;
//typedef __uint128_t L;
typedef unsigned long long L;
typedef unsigned long long ull;
const int N=1e5+10,M=128,mod=998244353;
int t,m,pw[N][M];
ll n;
map<ll,vector<P>>mp;//dp[i][2]表示是否开口的方案数
void add(int &x,int y){x=(x+y)%mod;
}
vector<P>dfs(ll n){if(n==0)return vector<P>(1,{0,0});if(n==1)return vector<P>(1,{0,1});if(mp.count(n))return mp[n];int k = std::__lg(n + 1);ll ls=((1LL << (k - 1)) - 1) + std::min(1LL << (k - 1), n - (1LL << k) + 1);ll rs=n-1-ls;vector<P>l=dfs(ls),r=dfs(rs);int sl=SZ(l),sr=SZ(r);//printf("n:%lld lsz:%d rsz:%d\n",n,sl,sr);vector<P>dp(128,{0,0});rep(i,0,sl-1){rep(j,0,sr-1){if(!l[i][1] || !r[j][1])continue;add(dp[i+j+2][0],1ll*l[i][1]*r[j][1]%mod);}}rep(i,0,sl-1){add(dp[i][0],l[i][0]);add(dp[i][0],l[i][1]);add(dp[i+1][1],l[i][1]);}rep(i,0,sr-1){add(dp[i][0],r[i][0]);add(dp[i][0],r[i][1]);add(dp[i+1][1],r[i][1]);}add(dp[0][1],1);return mp[n]=dp;
}
int modpow(int x,ll n,int mod){if(!n)return 1;int res=1;for(;n;n>>=1,x=1ll*x*x%mod){if(n&1)res=1ll*res*x%mod;}return res;
}
int cal(int sz,int v){if(v==1)return 1;return (pw[v][sz]-pw[v-1][sz]+mod)%mod;
}
int sol(){vector<P>dp=dfs(n);int sz=SZ(dp),res=0;rep(j,0,sz-1){int cnt=(dp[j][0]+dp[j][1])%mod,len=j+1;if(len>n)break;int oth=modpow(m,n-len,mod)%mod;rep(i,1,m){add(res,1ll*cnt*cal(len,i)%mod*i%mod*oth%mod);}}return res;
}
int main(){rep(i,1,N-1){pw[i][0]=1;rep(j,1,M-1){pw[i][j]=1ll*pw[i][j-1]*i%mod;}}sci(t);while(t--){scanf("%lld%d",&n,&m);printf("%d\n",sol());}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

邮件数据安全案例 | 有一种遇见,叫相见恨晚

Mr.赵回忆和联通相遇的时刻&#xff0c;他说&#xff0c;用一句诗来形容恰如其分&#xff0c;“众里寻他千百度&#xff0c;蓦然回首&#xff0c;那人却在&#xff0c;灯火阑珊处” 。 中国联合网络通信集团有限公司在国内31个省&#xff08;自治区、直辖市&#xff09;和境外…

排序算法:归并排序(递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

【多目标跟踪】 TrackFormer 耗时三天 单句翻译!!!

【多目标跟踪】 TrackFormer 耗时三天 单句翻译&#xff01;&#xff01;&#xff01; TrackFormer: Multi-Object Tracking with Transformers Abstract The challenging task of multi-object tracking (MOT) re-quires simultaneous reasoning about track initiali…

uniappAndroid平台签名证书(.keystore)生成

一、安装JRE环境 https://www.oracle.com/java/technologies/downloads/#java8 记住下载默认安装地址。ps&#xff1a;我都默认安装地址C:\Program Files\Java\jdk-1.8 二、安装成功后配置环境变量 系统变量配置 AVA_HOME 放到环境变量去 %JAVA_HOME%\bin 三、生成签名证书…

本地电脑搭建SFTP服务器,并实现公网访问

本地电脑搭建SFTP服务器&#xff0c;并实现公网访问 文章目录 本地电脑搭建SFTP服务器&#xff0c;并实现公网访问1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内…

苹果手机无法正常使用小程序和APP

小程序、APP 已使用了几年&#xff0c;突然大量反馈&#xff1a;苹果手机无法正常使用。但不是全部&#xff0c;只是部分手机。 因为同事苹果手机都能用&#xff0c;所以无法准确判断具体原因。 后来同事苹果手机也无法使用了&#xff0c;显示&#xff1a; 网上搜索结果&…

全国职业技能大赛云计算--高职组赛题卷④(私有云)

全国职业技能大赛云计算--高职组赛题卷④&#xff08;私有云&#xff09; 第一场次题目&#xff1a;OpenStack平台部署与运维任务1 基础运维任务&#xff08;5分&#xff09;任务3 OpenStack云平台运维&#xff08;15分&#xff09;任务4 OpenStack云平台运维开发&#xff08;1…

【xshell7】设置语法高亮(突出显示集)方式

设置高亮方式 增加文件路径 将下面内容起名 以.hls结尾&#xff0c;放入截图位置&#xff0c;然后按照步骤一选择即可 [Keyword_0] TermBackColor1 Underline1 Bold0 Strikeout0 Keyword[_a-z0-9-](.[_a-z0-9-])*[a-z0-9-](.[a-z0-9-])* DescriptionEmail address BackColorIn…

解决jupyter找不到虚拟环境的问题

解决jupyter找不到虚拟环境的问题 使用jupyter只能使用base环境&#xff0c;不能找到自己创建的虚拟环境。如下图&#xff0c;显示的默认的虚拟环境base的地址。 如何解决这个问题&#xff1f;需要两个步骤即可 1 . 在base环境中安装nb_conda_kernels这个库 activate base c…

第9章 【MySQL】InnoDB的表空间

表空间 是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为 表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个 页 的池子&#xff0c;当我…

Brother CNC联网数采集和远程控制

兄弟CNC IP地址设定参考&#xff1a;https://www.sohu.com/a/544461221_121353733没有能力写代码的兄弟可以提前下载好网络调试助手NetAssist&#xff0c;这样就不用写代码来测试连接CNC了。 以上是网络调试助手抓取CNC的产出命令&#xff0c;结果有多个行string需要自行解析&…

汽车电子系统总线LIN通信协议精要

汽车电子系统总线LIN通信协议精要 文章目录 汽车电子系统总线LIN通信协议精要简介LIN信号的物理层LIN总线收发器 LIN通信协议LIN的主机和从机LIN报文帧结构同步间隔段&#xff08;Break field&#xff09;同步段&#xff08;Sync field&#xff09;受保护的帧ID&#xff08;Pro…

uview组件库的安装

更多的请查看官方文档uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) // 如果您的根目录没有package.json文件的话&#xff0c;请先执行如下命令&#xff1a; // npm init -y 安装 npm install uview-ui2.0.36 // 更新 // npm update uvie…

【案例教学】华为云API图引擎服务 GES的便捷性—AI帮助快速处理图片小助手

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI快速处理图片 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&#xff0c;基于华为云服务提供…

Ubuntu20.04安装Nvidia显卡驱动、CUDA11.3、CUDNN、TensorRT、Anaconda、ROS/ROS2

1.更换国内源 打开终端&#xff0c;输入指令&#xff1a; wget http://fishros.com/install -O fishros && . fishros 选择【5】更换系统源&#xff0c;后面还有一个要输入的选项&#xff0c;选择【0】退出&#xff0c;就会自动换源。 2.安装NVIDIA驱动 这一步最痛心…

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、字符…

9.20号作业实现钟表

1.widget.h #include <QPainter> //画家 #include <QTimerEvent> #include <QTime> #include<QTimer> //定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Wid…

iOS 使用陀螺仪实现裸眼3d效果

直接上完整代码 // // BannerView.m // Test // // Created by liubo on 2023/7/20. //#import "LB3DBannerView.h" #import <Masonry/Masonry.h> #import <CoreMotion/CoreMotion.h>interface LB3DBannerView (){CGFloat maxOffset;CGFloat lastGra…

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境Scikit-learnt 模块实现1. 数据预处理2. 客流预测3. 百度地图API调用4. GUI界面设计5. 路径规划6. 智能推荐 系统测试1. 训练准确率2. 测试效果3. 程序应用 相关其它博客工程源代码下载其它资料下载 …

eslint代码校验及修复(Vue项目快速上手)

项目中配置eslint校验 文章目录 项目中配置eslint校验前言1. webpack5搭建 Vue项目如下🔗(可以查看)2. eslint+prettier Vue项目如下🔗(暂时未更新)一、什么是 ESLint?二、为什么要使用 ESLint?三、如何在 Vue 项目中集成 ESLint?3.1.安装依赖代码如下:如下图所示3…