【刷题笔记】第七天

文章目录

    • [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)
      • 方法一,并查集
      • 方法二,dfs
  • [GCD and LCM ](https://vjudge.net.cn/problem/HDU-4497#author=KING_LRL)

924. 尽量减少恶意软件的传播

如果移除一个感染节点可以避免连通图内节点的感染,那么该节点可能是最终的答案

我们要找避免连通图内节点感染的最大值,也就是求最大的含感染节点的连通图(连通图内只能有一个感染节点

方法一,并查集

首先我们构建连通图,并统计连通图内的节点个数

然后求最大的含感染节点的连通图

看到连通图,就想到并查集

class Solution {int n;int[] p;int[] size; // 记录集合内的元素个数public int find(int i) {if (i != p[i]) {p[i] = find(p[i]);}return p[i];}public void union(int a, int b) {int aFather = find(a);int bFather = find(b);if (aFather != bFather) {p[bFather] = aFather;size[aFather] += size[bFather];}}public int minMalwareSpread(int[][] graph, int[] initial) {n = graph.length;p = new int[n];size = new int[n];for (int i = 0; i < n; ++i) {p[i] = i;size[i] = 1;}for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (graph[i][j] == 1) {union(i, j);}}}Arrays.sort(initial);// 维护感染节点所在的集合Map<Integer, ArrayList<Integer>> map = new HashMap<>(); // key:感染节点的代表节点,value:代表节点所在集合的感染情况(哪些节点已经感染了)for (int x : initial) {int xFather = find(x);if (!map.containsKey(xFather)) {map.put(xFather, new ArrayList<>());}ArrayList<Integer> list = map.get(xFather);list.add(x);}int cnt = 0; // 避免感染节点的最大值int ans = n; // 要移除的索引for (Integer key : map.keySet()) {ArrayList<Integer> value = map.get(key);if (value.size() > 1) {// 如果集合内的感染节点数超过1,那么移除任意哪个节点,都不能避免该集合内节点感染continue;}// value.size()肯定为1int t = value.get(0); // value中索引最小的感染节点int tFather = find(t);if (size[tFather] > cnt) {cnt = size[tFather];ans = t;} else if (size[tFather] == cnt && t < ans) {// 索引更小ans = t;}}// ans = n,表示没有找到最大的含感染节点的连通图,也就是说移除任何一个感染节点,最终的感染节点数是一样的return ans == n ? initial[0] : ans;}
}

方法二,dfs

求最大的连通块,dfs当然也能做

需要注意的是我们要求的连通块是只含有一个感染节点的连通块。

那么如何标记我们搜索的连通块是想要的连通块呢?
可以通过设置节点状态来判断,
一个感染节点也没找到,状态为-1
找到了第一个感染节点,状态为x (感染节点的编号)
又找到了感染节点,状态为-2

所以在搜索完一个连通块后,判断状态是否大于等于0,只有大于等于0的连通块才是我们想要的连通块。

class Solution {int n;boolean[] vis;boolean[] isInitial; // 判断是否是感染节点int nodeState = -1; // -1标识初始状态,x(大于等于0)找到一个感染节点,-2找到两个感染节点int size; // 计算连通块内的节点个数public void dfs(int x, int[][] graph) {vis[x] = true;size++;if (isInitial[x]) {// x是感染节点if (nodeState == -1) {// 找到了第一个感染节点nodeState = x;} else {nodeState = -2;}}for (int y = 0; y < graph[x].length; ++y) {if (vis[y]) continue;if (graph[x][y] == 1) {dfs(y, graph);}}}public int minMalwareSpread(int[][] graph, int[] initial) {n = graph.length;vis = new boolean[n];isInitial = new boolean[n];for (int i : initial) {isInitial[i] = true;}int maxSize = 0;int ans = n;Arrays.sort(initial);for (int i : initial) {if (vis[i]) continue;nodeState = -1;size = 0;dfs(i, graph);if (nodeState >= 0) {if (size > maxSize) {maxSize = size;ans = i;} else if (size == maxSize && i < ans) {ans = i;}}}return ans == n ? initial[0] : ans;}
}

GCD and LCM

最大公因数、最小公倍数的性质:

假设gcd(x, y) = G,lcm(x, y) = L
1. L % G == 0
2. L / G = (x / G) * (y / G)
3. gcd(kx, ky) = k gcd(x, y) = kG,所以gcd(x/G, y/G) = 1
lcm(x/G, y/G) = L/G
4. 两个互素的数的最小公倍数等于两者乘积
5. gcd(x, y) * lcm(x, y) = x y

image-20240416213542708

对于此题x, y, z,假设gcd(x, y, z) = G, lcm(x, y, z) = L
我们令x’ = x/ G, y’= y/G, z’ = z /G,所以gcd(x’, y’, z’) = 1, lcm(x’, y’, z’) = L / G
所以我们将原问题转化为,(x,y,z)的最大公约数为1,最小公倍数为L/G的个数

令L’ = L / G
我们对L‘ 进行素因子分解,可得 L ′ = x 1 p 1 x 2 p 2 . . . x m p m ,其中 x 1 , x 2 , . . . , x m 都是素数 L'=x_1^{p_1}x_2^{p_2}... x_m^{p_m},其中x_1,x_2, ..., x_m都是素数 L=x1p1x2p2...xmpm,其中x1,x2,...,xm都是素数,这里默认使用了一个结论(任何数都可以分解为若干个素数的乘积),然后对x’,y‘,z’分解可得:
x ′ = x 1 a 1 x 2 a 2 . . . x m a m x'=x_1^{a_1}x_2^{a_2}... x_m^{a_m} x=x1a1x2a2...xmam
y ′ = x 1 b 1 x 2 b 2 . . . x m b m y'=x_1^{b_1}x_2^{b_2}... x_m^{b_m} y=x1b1x2b2...xmbm
z ′ = x 1 c 1 x 2 c 2 . . . x m c m z'=x_1^{c_1}x_2^{c_2}... x_m^{c_m} z=x1c1x2c2...xmcm

先看分解式的第一项 x 1 ? 1 x_1^{?_1} x1?1
由于gcd(x’, y’, z’) = 1,所以 a 1 , b 1 , c 1 a_1, b_1,c_1 a1,b1,c1中至少有一个是0,(假设 a 1 , b 1 , c 1 a_1, b_1,c_1 a1,b1,c1都不为0,那么最大公约数肯定不为1,因为他们都有 x 1 x_1 x1这个因子)
a 1 , b 1 , c 1 a_1, b_1,c_1 a1,b1,c1中至少有一个是 p 1 p_1 p1(因为他们的最小公倍数是L‘,如果 a 1 , b 1 , c 1 a_1, b_1,c_1 a1,b1,c1都不是 p 1 p_1 p1,那么他们的乘积也就是公倍数(不是最小公倍数,因为xyz不一定互质)的分解不存在 x 1 p 1 x_1^{p_1} x1p1这一项)
所以 a 1 , b 1 , c 1 a_1, b_1,c_1 a1,b1,c1至少一个是0,至少一个是 p 1 p_1 p1 ,情况如下:

  • 1个0, 2个p1, (0, p1, p1) , (p1, 0, p1), (p1, p1, 0) ,3种
  • 2个0 , 1个p1,(0, 0, p1), (p1, 0, 0), (0, p1, 0), 3种
  • 1个0, 1个p1,1~p1-1,(0, p1, 1~p1-1), … A 3 2 ( p 1 − 1 ) = 6 ( p 1 − 1 ) A^2_3(p_1 - 1) = 6(p_1-1) A32(p11)=6(p11)

所以总共有 6 p 1 种情况 6p_1种情况 6p1种情况,这是第一项的情况数,还有第二项,第三项…
根据乘法定理,总情况数= 6 p 1 ∗ 6 p 2 . . . ∗ 6 p m 6p_1*6p_2...*6p_m 6p16p2...6pm

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>using namespace std;
int main() {int t;scanf("%d", &t);while (t--) {int g, l;scanf("%d%d", &g, &l);if (l % g != 0) {printf("0\n");continue;}l = l / g;int x = 2; // 对l进行分解, l = 2^p1 + 3^p2 + ..int ans = 1;while (l > 1) {int cnt = 0; // 计算p1, p2..while (l % x == 0) {l = l / x;cnt++;}if (cnt > 0) {ans *= 6 * cnt;}x++;}printf("%d\n", ans);}return 0;
}

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

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

相关文章

上海计算机学会 2023年10月月赛 乙组T4 树的覆盖(树、最小点覆盖、树形dp)

第四题&#xff1a;T4树的覆盖 标签&#xff1a;树、最小点覆盖、树形 d p dp dp题意&#xff1a;求树的最小点覆盖集的大小和对应的数量&#xff0c;数量对 1 , 000 , 000 , 007 1,000,000,007 1,000,000,007取余数。所谓覆盖集&#xff0c;是该树的点构成的集合&#xff0c;…

docker 环境变量设置实现方式

1、前言 docker在当前运用的越来广泛&#xff0c;很多应用或者很多中间软件都有很多docker镜像资源&#xff0c;运行docker run 启动镜像资源即可应用。但是很多应用或者中间件有很多配置参数。这些参数在运用过程怎么设置给docker 容器呢&#xff1f;下面介绍几种方式 2 、do…

无线网络安全之WiFi Pineapple初探

背景 WiFi Pineapple&#xff08;大菠萝&#xff09;是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器。集合了一些功能强大的模块&#xff0c;基本可以还原钓鱼攻击的全过程。在学习无线安全时也是一个不错的工具&#xff0c;本文主要讲WiFi Pineapple基础配置…

和鲸科技将参与第五届空间数据智能学术会议并于应急减灾与可持续发展专题论坛做报告分享

ACM SIGSPATIAL中国分会致力于推动空间数据的研究范式及空间智能理论与技术在时空大数据、智慧城市、交通科学、社会治理等领域的创新与应用。ACM SIGSPATIAL中国分会创办了空间数据智能学术会议&#xff08;SpatialDI&#xff09;&#xff0c;分会将于2024年4月25日-27日在南京…

javaWeb项目-快捷酒店管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

PSCAD|应用于输电线路故障测距的行波波速仿真分析

1 主要内容 该程序参考文献《应用于输电线路故障测距的行波波速仿真分析》&#xff0c;利用线路内部故障产生的初始行波浪涌达线路两端测量点的绝对时间之差值计算故障点到两端测量点之间的距离&#xff0c;并利用小波变换得到初始行波波头准确到达时刻&#xff0c;从而精准定…

富文本在线编辑器 - tinymce

tinymce 项目是一个比较好的富文本编辑器. 这里有个小demo, 下载下来尝试一下, 需要配置个本地服务器才能够访问, 我这里使用的nginx, 下面是我的整个操作过程: git clone gitgitee.com:chick1993/layui-tinymce.git cd layui-tinymcewget http://nginx.org/download/nginx-1.…

JavaEE:JVM

基本介绍 JVM&#xff1a;Java虚拟机&#xff0c;用于解释执行Java字节码 jdk&#xff1a;Java开发工具包 jre&#xff1a;Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言&#xff0c;而java不想重新编译&#xff0c;希望能直接执行。Java先通过javac把.java…

RK3568 学习笔记 : 更改 u-boot spl 中的 emmc 的启动次序

环境 开发板&#xff1a; 【正点原子】 的 RK3568 开发板 ATK-DLRK3568 u-boot 版本&#xff1a;来自 【正点原子】 的 RK3568 开发板 Linux SDK&#xff0c;单独复制出来一份&#xff0c;手动编译 编译环境&#xff1a;VMware 虚拟机 ubuntu 20.04 问题描述 RK3568 默认 …

浅谈线程的生命周期

Java线程的生命周期是一个从创建到终止的过程&#xff0c;经历了多种状态的转变。在Java中&#xff0c;线程的生命周期可以划分为以下几个主要状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a; 当使用 new Thread() 创建一个新的线程对象但尚未调用 start() 方法…

CSS基础之伪元素选择器(如果想知道CSS的伪元素选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;我们已经知道了在CSS中&#xff0c;选择器有基本选择器、复合选择器、伪类选择器、那么选择器学习完了吗&#xff1f;显然是没有的&#xff0c;这篇文章讲解最后一种选择器——伪元素选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

【linux】mobaterm如何kill pycharm进程

【linux】mobaterm如何kill pycharm进程 【先赞后看养成习惯】求点赞关注收藏&#x1f600; 使用云服务器时&#xff0c;pycharm在打开状态下&#xff0c;不小心关了mobaxterm&#xff0c;然后再输入pycharm.sh就会打不开pycharm&#xff0c;显示已经打开报错&#xff1a;Com…

软考131-上午题-【软件工程】-软件可靠性、可用性、可维护性

可靠性、可用性和可维护性是软件的质量属性&#xff0c;软件工程中&#xff0c;用 0-1 之间的数来度量。 0.66 66% 1、 可靠性 可靠性是指一个系统对于给定的时间间隔内、在给定条件下无失效运作的概率。 可以用 MTTF/ (1MTTF) 来度量&#xff0c;其中 MTTF 为平均无故障时间…

PHP一句话木马

一句话木马 PHP 的一句话木马是一种用于 Web 应用程序漏洞利用的代码片段。它通常是一小段 PHP 代码&#xff0c;能够在目标服务器上执行任意命令。一句话木马的工作原理是利用 Web 应用程序中的安全漏洞&#xff0c;将恶意代码注入到服务器端的 PHP 脚本中。一旦执行&#xf…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…

智能商品计划系统如何提升鞋服零售品牌的竞争力

国内鞋服零售企业经过多年的发展&#xff0c;已经形成了众多知名品牌&#xff0c;然而近年来一些企业频频受到库存问题的困扰&#xff0c;这一问题不仅影响了品牌商自身&#xff0c;也给长期合作的经销商带来了困扰。订货会制度在初期曾经有效地解决了盲目生产的问题&#xff0…

机器学习方法在测井解释上的应用-以岩性分类为例

机器学习在测井解释上的应用越来越广泛&#xff0c;主要用于提高油气勘探和开发的效率和精度。通过使用机器学习算法&#xff0c;可以从测井数据中自动识别地质特征&#xff0c;预测岩石物理性质&#xff0c;以及优化油气储层的评估和管理。 以下是机器学习在测井解释中的一些…

OpenHarmony南向开发实例:【游戏手柄】

介绍 基于TS扩展的声明式开发范式编程语言&#xff0c;以及OpenHarmony的分布式能力实现的一个手柄游戏。 完成本篇Codelab需要两台开发板&#xff0c;一台开发板作为游戏端&#xff0c;一台开发板作为手柄端&#xff0c;实现如下功能&#xff1a; 游戏端呈现飞机移动、发射…

Windows 安装 Node.js 开发环境

一、简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;主要功能是编写像 web 服务器一样的网络应用。它使用事件驱动、非阻塞式 I/O 模型&#xff0c;可以优化应用程序的传输量和规模&#xff0c;非常适合在分布式设备上运行数据密集型的实时应用。 …

【C++】适配器· 优先级队列 仿函数 反向迭代器

目录 适配器&#xff1a;适配器的应用&#xff1a;1. 优先级队列&#xff1a;仿函数&#xff1a;更深入的了解仿函数&#xff1a;一个关于不容易被注意的知识点&#xff1a; 2. 反向迭代器&#xff1a;&#xff08;list为例&#xff09; 适配器&#xff1a; 我们先来谈来一下容…