[M数学] lc3164. 优质数对的总数 II(因数分解+倍增+推公式+思维+好题)

embedded/2024/10/22 16:49:35/

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:3164. 优质数对的总数 II

2. 题目解析

挺不错的一道 因数分解、倍增 的题目,需要一定的思维和推公式的能力才能解决。灵神的题解已经非常清晰易懂了,可以直接去看。

倍增思路:

  • 枚举 num1、nums2 每个数出现的次数。
  • 再枚举 nums2 * k 的倍数,如果在 nums1 中有出现,则基于乘法原理,两个次数相乘累加结果。
  • 倍数累计的上界即为 nums1 中的最大值。

分解因数思路:

  • 考虑,nums1[i] % (nums2[j] * k) == 0 则有,(nums1[i] / k) % nums2[j] == 0
  • 即,nums1[i] 首先是 k 的倍数,且 nums1[i]/k 存在因子 nums2[j]
  • 那么可以针对 nums1[i]/k 分解它的各个因子,并记录个数,此时 cnt[a]=b 则等价于有 b 个 nums[i]/k 存在因子 a
  • 枚举每一个 nums2,答案累加 cnt[nums2[j]] 即可。

具体的,见灵神题解,很清楚了:

  • 两种方法:枚举因子/枚举倍数(Python/Java/C++/Go/JS/Rust)

这个东西分析有点难度,见灵神的分析吧…
在这里插入图片描述


因数分解代码:

class Solution {
public:long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {typedef long long LL;unordered_map<int, int> h;for (auto x : nums1) {if (x % k) continue;x /= k;for (int i = 1; i <= x / i; i ++ ) {if (x % i) continue;h[i] ++ ;if (i * i < x) h[x / i] ++ ;}}LL res = 0;for (int x : nums2) res += h[x];return res;}
};

倍增代码:

class Solution {
public:long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {typedef long long LL;unordered_map<int, int> cnt1, cnt2;for (auto x : nums1) if (x % k == 0)cnt1[x / k] ++ ;for (auto x : nums2) cnt2[x] ++ ;int u = -1;for (auto [k, v] : cnt1) u = max(u, k);LL res = 0;for (auto [x, cnt] : cnt2 ) {int s = 0;for (int y = x; y <= u; y += x) s += cnt1[y];res += 1ll * s * cnt;}return res;}
};

http://www.ppmy.cn/embedded/127624.html

相关文章

MySQL--视图(详解)

目录 一、前言二、视图2.1概念2.2语法2.3创建视图2.3.1目的 2.4查看视图2.5修改数据2.5.1通过真实表修改数据&#xff0c;会影响视图2.5.2通过修改视图&#xff0c;会影响基表 2.6注意2.7 删除视图2.8 视图的优点 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&…

Oracle中处理空值函数(NVL、NVL2、NULLIF等)详解

文章目录 前言一、函数语法NVL函数NVL2函数NULLIF函数COALESCE函数DECODE函数 二、用法区别三、测试用例总结 前言 本文将介绍Oracle中处理空值的函数。常用的处理函数有&#xff1a;NVL()、NVL2()、NULLIF()、COALESCE()。此外DECODE()和CASE()函数也可以起到处理空值的效果。…

Windows Server环境部署Oracle 19c

Windows Server环境部署Oracle 19c 1.安装包下载2.安装运行库3. 数据库安装前期规划4. 数据库安装4.1 解压4.2 开始安装4.3 配置选项4.4 系统类4.5 Oracle主目录用户4.6 典型安装4.7 先决条件检测4.8 概要4.9 安装产品4.10 完成 5. 连接数据库 1.安装包下载 Oracle19c安装包下…

uniapp学习(004-1 组件 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第26p-第p30的内容 文章目录 uniapp和vue差异对比写几个组件并且引用props传值添加类型约束约束类型并且添加默…

OpenCV视频I/O(17)视频写入类VideoWriter之检查视频编写器是否已经成功初始化的函数isOpened()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果视频编写器已经成功初始化&#xff0c;则返回 true。 isOpened()函数用于检查 VideoWriter 对象是否已经成功初始化并且准备好写入视频帧。…

pdf阅读器哪个好用?5个软件帮助你快速阅读pdf文件

pdf阅读器哪个好用&#xff1f;5个软件帮助你快速阅读pdf文件 如果你在寻找好用的 PDF 阅读器&#xff0c;有很多强大的软件可以帮助你轻松、高效地阅读和处理 PDF 文件。这些软件不仅可以简单地查看文件&#xff0c;还能提供标注、评论、注释和文档管理等额外功能。以下是5款…

【计算机网络】IPv4地址的表示方法

文章目录 概念表示方法网络部分和主机部分子网掩码特殊地址 概念 IPv4&#xff08;Internet Protocol version 4&#xff09;地址是用于标识网络设备的32位数字地址。 表示方法 IPv4地址通常以点分十进制的形式表示&#xff0c;由四个十进制数构成&#xff0c;每个数的取值范…

LangChain使用Prompt02

1.设置提示 from langchain.prompts import ChatPromptTemplate prompt_template ChatPromptTemplate.from_messages([("system", "你是一位专业的翻译&#xff0c;能够将{input_language}翻译成{output_language}&#xff0c;并且输出文本会根据用户要求的任…