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

[FZYZOJ6734] 树上LCM

题目链接

来源:HDU 2025暑期多校第一场 G

HDU 链接(没有参加好像打不开)

BUCTOJ 链接(上面打不开就去这里)

题目描述

给定一棵大小为 \(n\) 的树,每个节点有点权。请求出有多少条简单路径(长度可以为 0),使得路径所包括的所有点(包括路径两端的点)点权的最小公倍数是 \(x\)

两条简单路径不同,当且仅当树上至少存在一条边,它在其中一个路径里而不在另一个路径里。

说明/提示

对于所有的数据,\(1 \le n \le 10^5\)\(\sum n \le 3 \times 10^5\)\(1 \le x,a_i \le 10^7\)

子任务 特殊限制 分值
\(1\) \(n,x,a_i \le 10\) \(20\)
\(2\) \(n \le 500\) \(20\)
\(3\) \(x\) 是质数 \(20\)
\(4\) \(v=u+1\) \(20\)
\(5\) \(20\)

解题思路

官方题解的方法是神秘的高维前缀和 DP,还有使用莫比乌斯反演的,也很好理解,这篇题解给出与莫比乌斯反演类似的容斥方法,不会莫比乌斯反演的也能看懂。

考虑题目要求的是 \(\operatorname{lcm}\) 恰好等于 \(x\) 的路径条数,那我们弱化一下条件:求 \(\operatorname{lcm}\)\(x\) 约数的路径条数。

因此,我们定义以下状态:

  • \(f_i\)\(\operatorname{lcm}\) 等于 \(i\) 的路径条数。
  • \(g_i\)\(\operatorname{lcm}\)\(i\) 约数的路径条数。

那么容斥一下,\(f_i=g_i-\sum_{d\mid i\land d\neq i}f_d\)。因此,只要算出 \(x\) 所有约数的 \(g\) 值,就可以算出 \(f_x\) 的值了。

考虑 \(g_i\) 的计算方式。路径的 \(\operatorname{lcm}\)\(i\) 的约数,当且仅当路径上每个点的点权为 \(i\) 的约数。因此,把点权不是 \(i\) 的约数的点删去后,剩下的所有路径均满足要求。对于大小为 \(s\) 的联通块,其中的路径条数为 \(\frac{s(s-1)}{2}\) 条。这样,我们就可以在 \(O(n)\) 的复杂度内计算出 \(g_i\) 的值。

由于 \(x\leq 10^7\)\(10^7\) 内任意数的因数个数不超过 \(448\),最终的时间复杂度为 \(O(448^2n)\),且严重不满 (尽管这样但也跑得很慢) ,可以过的。

参考代码

//代码来自 id:AC___ 
#include <bits/stdc++.h>
#define int long long
#define N 200005
using namespace std;int t,n,x,cnt,ans;
int a[N],b[N],f[10000005];
vector<int> e[N],v;void dfs(int x,int fa) {b[x]=0,cnt++;for(int i:e[x]) if(i!=fa && b[i]) dfs(i,x);
}int sol(int o) {for(int i=1; i<=n; i++) b[i]=!(o%a[i]);int sum=0;for(int i=1; i<=n; i++)if(b[i]) {cnt=0;dfs(i,0);sum+=cnt*(cnt+1)/2;}return sum;
}main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>t;while(t--) {memset(f,0,sizeof f);cin>>n>>x;v.clear();for(int i=1; i<=n; i++) e[i].clear();for(int i=1,u,v; i<n; i++) {cin>>u>>v;e[u].push_back(v);e[v].push_back(u);}for(int i=1; i<=n; i++) cin>>a[i];for(int i=1; i*i<=x; i++)if(x%i==0) {v.push_back(i);if(i*i!=x) v.push_back(x/i);}sort(v.begin(),v.end());for(int i:v) {f[i]=sol(i);for(int j:v) {if(i==j) break;if(i%j==0) f[i]-=f[j];}}cout<<f[x]<<'\n';}
}
http://www.sczhlp.com/news/3439/

相关文章:

  • Cradle:颠覆AI Agent 操作本地软件,AI驱动的通用计算机控制框架,如何让基础模型像人一样操作你的电脑?
  • 哪个有针对于Vista,Win7,Win10,Win11的AMD PCNET Family Ethernet Adapter (PCI)虚拟机网卡驱动
  • 8月1号
  • GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
  • GitHub 开源爆款工具|MediaCrawler:程序员零门槛采集抖音/小红书/B站等社交评论,30K star 背后的场景实战揭秘!
  • AI 调酒师上岗!接管酒吧吧台
  • 洛谷 P2024 拓展域并查集
  • 基于 Rust 和土木工程、设备故障诊断、混凝土养护、GPS追踪、供应链物流跟踪系统、地下水监测等领域的实例 - 详解
  • 1.3 操作系统
  • AI HR重磅奖项发布!易路接连斩获思旗奖及人力资源AI企业25强
  • [COCI 2023/2024 #2] Dizalo
  • 表级锁-间隙锁/临键锁 - Charlie
  • 8月1日总结
  • Nuxt3项目中引用nuxt-swiper时,slideTo方法失效?
  • C语言中死锁的产生原因及预防
  • 英语背单词 专八词汇 中英对照 2025年08月
  • [特殊字符] 数字孪生 + 数据可视化:实战经验分享,让物理世界素材 “会说话”
  • 对象存储 RustFS 用户的删除和创建
  • JavaScript
  • cs106l assignment 2025spring
  • CodeGeeX体验GLM4.5模型与实践
  • 【自学嵌入式:51单片机】用UART串口通信和矩阵按键实现快速打开win系统中的一些程序
  • CEC协议_1_cecMsg数据帧是如何定义的?
  • Doris 性能优化
  • 惊艳!GitHub 开发者一键接入!4.2k star 项目 Champ,用一张照片秒变动画
  • CH395调试与使用
  • 免费,Qwen3-Coder不限量!
  • ModelGate 支持 Claude Code,一键设置 A编程助手,开发效率极速提升!
  • iOS 加固工具实战解析,主流平台审核机制与工具应对策略
  • 提升SketchUp建模效率!智达云v1.1.26插件图文安装教程