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

news2025/4/8 0:31:03

题目

有一棵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.coloradmin.cn/o/1028321.html

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

相关文章

mysql中update更新时加条件和不加条件速度对比

测试时有时需要执行更新操作&#xff0c;想知道大量数据update时加where条件和不加where条件速度差异如何&#xff0c;正好有条件测试&#xff0c;记录一下。 数据&#xff1a;9张表&#xff0c;每张表300w条数据 一、对9张表进行单字段更新时不加条件(如&#xff1a;update …

支付功能、支付平台、支持渠道如何测试?

有学员提问&#xff1a;作为一个支付平台&#xff0c;接入了快钱、易宝或直连银行等多家的渠道&#xff0c;内在的产品流程是自己的。业内有什么比较好的测试办法&#xff0c;来测试各渠道及其支持的银行通道呢&#xff1f; 作为产品&#xff0c;我自己办了十几张银行卡方便测…

web大作业 比赛报名页面+ 团队介绍页面 制作

web大作业 比赛报名页面 团队介绍页面 制作【附源代码】 文章目录 web大作业 比赛报名页面 团队介绍页面 制作【附源代码】前言报名界面效果图如下&#xff1a;代码实现计时器效果实现&#xff08;jqueryboostrap&#xff09; 团队介绍页面模拟框代码&#xff1a;CSS代码 前言 …

android studio 找不到设备

问题描述&#xff1a; 当android studio 没有打开&#xff0c; 执行adb devices 可以查看到设备&#xff0c; 当android studio 打开&#xff0c; 执行adb devices 可以查看不到设备&#xff0c; android studio 设备管理器中也没有设备 解决方法&#xff1a; 关闭android s…

uniapp 开发 之 如何给边框添加阴影效果

uniapp 开发 之 如何给边框添加阴影效果 image.png <view style"width: 100px; height: 100px; margin: 50px; -moz-box-shadow:2px 2px 10px #06c; -webkit-box-shadow:2px 2px 10px #06c; box-shadow:2px 2px 10px #06c; ">测试边框阴影</view>css的bo…

【算法与数据结构】450、LeetCode删除二叉搜索树中的节点

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题首先要分析删除节点的五种情况&#xff1a; 1、没有找到节点2、找到节点 左右子树为空左子树为空…

什么是线上商城?线上商城小程序怎么搭建?

线上商城是一种基于互联网的销售模式。它通过建立线上商店&#xff0c;展示、销售各类商品或服务&#xff0c;方便消费者在线上完成购买和支付。线上商城的出现在很大程度上改变了人们的购物习惯&#xff0c;为商家和消费者提供了更加便捷、高效的交易方式。 线上商城可以是网站…

SAP ALV 报表增删改查 及 下载模板导入文件

选择屏幕设置&#xff1a; 选择屏幕********************************************************************** * SELECTION-SCREEN ********************************************************************** SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001…

R语言ggpubr包优雅绘制带统计数据的箱线图

ggpubr包是个很经典的R包&#xff0c;能绘制专业的论文绘图&#xff0c;它是对ggplot2进行了加强&#xff0c;R包的说明也是介绍用于创建和自定义基于“ggplot2”的出版物绘图&#xff0c;就是个为SCI而生的R包呀&#xff0c;今天咱们使用ggpubr绘制专业的论文需要的带统计数据…

一文图解|内存页面迁移技术

1. 概述 页面迁移&#xff08;page migrate&#xff09;最早是为 NUMA 系统提供一种将进程页面迁移到指定内存节点的能力用来提升访问性能。后来在内核中广泛被使用&#xff0c;如内存规整、CMA、内存hotplug等。 页面迁移对上层应用业务来说是不可感知的&#xff0c;因为其迁…

【无标题】同创永益王澍│新环境下数字韧性建设探讨

2023年9月7日&#xff0c;由同创永益主办的2023数字韧性保险峰会在上海成功举办。ITSS DCMG组长肖建一等数十位保险行业专家、企业代表出席本次会议&#xff0c;同创永益与多方共同探讨保险行业数字化发展与数字韧性体系建设&#xff0c;共话行业数智化未来。 会上&#xff0c…

贵阳RapidSSL的ssl证书适合个人网站吗

现在很多开发者不论是为了记录还是宣传&#xff0c;很多人都会创建一个属于自己的网站&#xff0c;而有了自己的网站&#xff0c;为了保护网站信息安全以及防止网站数据被篡改与劫持&#xff0c;就需要为网站安装SSL证书。那么RapidSSL的SSL证书个人开发者可以使用吗&#xff1…

Windows Server 2008安装.NET Framework 3.5

安装.NET Framework 3.5一、打开服务器管理器 在开始菜单中搜索“服务器管理器” 二、添加.NET Framework 3.5.1功能 &#xff08;一&#xff09;功能-》添加功能 &#xff08;二&#xff09;选择功能“.NET Framework 3.51” 1.点击“NET Framework 3.5.1”勾选框 2.点击“添…

python教程:内置函数和语法糖触发魔法方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 下面总结python内置函数对应的魔法方法 魔法方法 数学计算 abs(args):返回绝对值&#xff0c;调用__abs__; round(args):返回四舍五入的值&#xff0c;调用__roun…

GPIO基础知识的概括

GPIO 是通用输入/输出端口的简称&#xff0c;本文以STM32为例进行说明&#xff0c;其他的单片机功能上都是大同小异&#xff0c;学会STM32的GPIO&#xff0c;我们可以触类旁通。 GPIO 的引脚与外部硬件设备连接&#xff0c;可实现与外部通讯、控制外部硬件或者采集外部硬件数据…

CMS之织梦导航二级下拉菜单

操作步骤 1、首先&#xff1a; 将下面这段代码贴到templets\default\footer.htm文件里&#xff08;只要在此文件里就行&#xff0c;位置无所谓啦&#xff01;自己看着办&#xff01;&#xff09; <!-- //二级子类下拉菜单&#xff0c;考虑SEO原因放置于底部 --><scr…

最大限度节省采购成本的七种方法

当前经济环境下&#xff0c;降低成本比以往任何时候都更受到企业的重视。降低成本通常是指在采购过程中节省的成本&#xff0c;但其实远不止于此。它还包括通过重新谈判合同条款和条件、改进管理和运营流程&#xff0c;以及数据和技术的智能使用而节省的成本。 节省采购成本的…

提升技术招聘有效性| 杜绝候选人刷题应试

企业在技术人员招聘中&#xff0c;时常出现候选人“笔试考高分&#xff0c;工作写Bug&#xff0c;绩效来垫底”的尴尬窘境&#xff0c;让企业倍感煎熬。不仅浪费时间精力、也增大招人的成本投入。 如何招到真正合适的技术人选&#xff0c;成为摆在企业心头的难题。 合适的技术…

Vue中的生命周期钩子

生命周期钩子 :::warning 注意 所有生命周期钩子的 this 上下文将自动绑定至实例中&#xff0c;因此你可以利用 this 访问 props、data、computed 和 methods 等选项内的数据/函数。这意味着你不应该使用箭头函数来定义一个生命周期方法&#xff0c;因为箭头函数中没有 this&a…

基于Kintex UltraScale系列FPGA KU060/KU115高性能PCIe数据预处理载板(5GByte/s带宽)

PCIE702是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口、1个RJ45千兆以太网口、2个QSFP 40G光纤接口。板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0…