Leetcode.1735 生成乘积数组的方案数

题目链接

Leetcode.1735 生成乘积数组的方案数 rating : 2500

题目描述

给你一个二维整数数组 q u e r i e s queries queries ,其中 q u e r i e s [ i ] = [ n i , k i ] queries[i] = [n_i, k_i] queries[i]=[ni,ki] 。第 i i i 个查询 q u e r i e s [ i ] queries[i] queries[i] 要求构造长度为 n i n_i ni 、每个元素都是正整数的数组,且满足所有元素的乘积为 k i k_i ki ,请你找出有多少种可行的方案。由于答案可能会很大,方案数需要对 1 0 9 + 7 10^9 + 7 109+7 取余 。

请你返回一个整数数组 a n s w e r answer answer,满足 a n s w e r . l e n g t h = = q u e r i e s . l e n g t h answer.length == queries.length answer.length==queries.length ,其中 a n s w e r [ i ] answer[i] answer[i] 是第 i i i 个查询的结果。

示例 1:
输入:queries = [[2,6],[5,1],[73,660]]
输出:[4,1,50734910]
解释:每个查询之间彼此独立。
[2,6]:总共有 4 种方案得到长度为 2 且乘积为 6 的数组:[1,6],[2,3],[3,2],[6,1]。
[5,1]:总共有 1 种方案得到长度为 5 且乘积为 1 的数组:[1,1,1,1,1]。
[73,660]:总共有 1050734917 种方案得到长度为 73 且乘积为 660 的数组。1050734917 对 109 + 7 取余得到 50734910 。
示例 2:
输入:queries = [[1,1],[2,2],[3,3],[4,4],[5,5]]
输出:[1,2,3,10,5]
提示:
  • 1 ≤ q u e r i e s . l e n g t h ≤ 1 0 4 1 \leq queries.length \leq 10^4 1queries.length104
  • 1 ≤ n i , k i ≤ 1 0 4 1 \leq n_i, k_i \leq 10^4 1ni,ki104

解法:组合数学 + 质因数分解

对于 [ n i , k i ] [n_i, k_i] [ni,ki] 就等价于 n i n_i ni 个相同的箱子,要把 k i k_i ki 的所有 质因子 放入到这 n i n_i ni 箱子中,有的箱子可以为空

例如 [ 2 , 6 ] [2, 6] [2,6],就是有 2 2 2 个箱子 [   ] [   ] [\ ] [\ ] [ ][ ] n = 2 × 3 n = 2 \times 3 n=2×3。一共有 4 4 4 种放法:

  • [ 2 ∗ 3 ] [   ] [2 * 3 ] [\ ] [23][ ]
  • [   ] [ 2 ∗ 3 ] [\ ] [2 * 3] [ ][23]
  • [ 2 ] [ 3 ] [2] [3] [2][3]
  • [ 3 ] [ 2 ] [3] [2] [3][2]

我们可以发现,对于不同的质因子都可以单独计算。假设这里把质因子 2 2 2 看作是小球 A A A,把质因子 3 3 3 看作是小球 B B B

  • 把小球 A A A 放到两个箱子中,一共有两种放法: [ A ] [   ] , [   ] [ A ] [A] [\ ], [\ ] [A] [A][ ],[ ][A]
  • 把小球 B B B 放到两个箱子中,一共有两种放法: [ B ] [   ] , [   ] [ B ] [B] [\ ], [\ ] [B] [B][ ],[ ][B]

所以一共有 2 × 2 = 4 2 \times 2 = 4 2×2=4 种放法。

假设一共有 m m m 个箱子, n n n 个球,把 n n n 个球放进 m m m 个箱子,并且允许出现空箱子的放法有多少种。

等价于 一共有 n + m n + m n+m 个球,要把这 n + m n + m n+m 个球分割成 m m m 部分,也就是 C ( n + m − 1 , m − 1 ) = C ( n + m − 1 , n ) C(n + m - 1, m - 1) = C(n + m - 1, n) C(n+m1,m1)=C(n+m1,n)

例如:假设有 3 3 3 个小球,要放到 4 4 4 个盒子中。

在这里插入图片描述

等价于 有 3 + 4 3 + 4 3+4 个小球,再把小球分为 4 4 4 个部分的方案数量

在这里插入图片描述

3 + 4 3 +4 3+4 个小球,一共有 3 + 4 − 1 = 6 3 + 4 - 1 = 6 3+41=6 个位置,要把这 7 7 7 个小球分为 4 4 4 个部分,直接从 6 6 6 个隔板中选 4 4 4 个插入,即 C ( 6 , 4 ) C(6, 4) C(6,4)

推广到 n n n 个小球, m m m 个箱子就是 C ( n + m − 1 , m − 1 ) = C ( n + m − 1 , n ) C(n + m - 1, m - 1) = C(n + m - 1, n) C(n+m1,m1)=C(n+m1,n)

那么我们就可以处理出 k i k_i ki 的所有质因数,也就是求出所有 小球,最后计算方案即可。

时间复杂度: ( ( N + l o g K ) l o g K ) ((N + logK) logK) ((N+logK)logK)

C++代码:

using LL = long long;
const int MOD = 1e9 + 7;
const int N = 1e4 + 15;
LL c[N][15];

auto _ = []()
{
    c[0][0] = 1;
    for(int i = 1;i < N;i++)
    {
        c[i][0] = 1;
        for(int j = 1;j < 15;j++) c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
    }
    return 0;
}();

class Solution {
public:
    vector<int> waysToFillArray(vector<vector<int>>& queries) {
        vector<int> ans;

        for(auto q:queries)
        {
            int n = q[0], k = q[1];
            LL res = 1;
            auto x = k;

            for(int i = 2;i <= x / i;i++)
            {
                if(x % i == 0)
                {
                    int cnt = 0;
                    while(x % i == 0)
                    {
                        x /= i;
                        cnt++;
                    }

                    res = res * c[cnt + n - 1][cnt] % MOD;
                }
            }

            if(x > 1) res = res * n % MOD;
            ans.push_back(res);
        }

        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画工具Midjourney:和Discord互相成就

前言 提到文生图&#xff0c;很多人都会想到植根于根植于Discord社区的Midjourney&#xff0c;本篇文章就基于作者的使用体验思考&#xff0c;并结合了Discord来对Midjourney进行探讨&#xff0c;感兴趣的朋友一起来看看吧。 如果要说现在最火的文生图&#xff0c;不得不说到Mi…

深入理解 “androidx.databinding.DataBindingUtil“ 细节和使用

介绍 数据绑定&#xff08;Data Binding&#xff09;是 Android 中的一个强大功能&#xff0c;它允许你使用声明性格式而不是编程方式将布局中的 UI 组件绑定到应用中的数据源。androidx.databinding.DataBindingUtil 类是一个工具类&#xff0c;它提供了用于处理数据绑定的方…

单片机语音识别控制蓝牙通信

基于单片机语音识别控制&蓝牙控制 1、Arduino单片机语音控制1.1 直连1.2 蓝牙无线连接1.3 部分核心程序1.4 实物演示 2、51单片机语音控制2.1 直连2.2 蓝牙无线连接2.3 部分核心程序2.4 实物演示 3、STM32单片机语音控制3.1 直连3.2 蓝牙无线连接3.3 部分核心程序3.4 实物演…

数据结构之“刷链表题”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…

RANSAC空间圆拟合实现

由初中的几何知识我们可以知道&#xff0c;确定一个三角形至少需要三个不共线的点&#xff0c;因此确定一个三角形的外接圆至少可用三个点。我们不妨假设三个点坐标为P1(x1,y1,z1),P2(x2,y2,z2),P3(x3,y3,z3)。 圆方程的标准形式为&#xff1a; (xi-x)2(yi-y)2R2 &#xff08;1…

8605 删数问题

这是一个典型的贪心算法问题。我们可以从高位开始&#xff0c;找到第一个比后面数字大的数字&#xff0c;删除它&#xff0c;然后继续这个过程&#xff0c;直到删除k个数字。如果我们已经删除了k个数字&#xff0c;但是还没有找到一个比后面数字大的数字&#xff0c;那么我们就…

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

首款内置电源的迷你主机,不到千元的办公神器 | 零刻EQ13评测报告

零刻首款内置电源的迷你主机&#xff0c;不到千元的办公神器 | 零刻EQ13评测报告 哈喽小伙伴们好&#xff0c;我是Stark-C~ 众所周知&#xff0c;零刻作为目前国产迷你主机第一品牌&#xff0c;旗下系列众多&#xff0c;产线丰富&#xff0c;比如说它有针对游戏玩家的性能主机…

Transformer动画讲解 - 工作原理

Transformer模型在多模态数据处理中扮演着重要角色,其能够高效、准确地处理包含不同类型(如图像、文本、音频、视频等)的多模态数据。 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。 阶段一:…

JS数据处理(冒泡寻找对象里面有个Key相同的值并处理相关数据)

1.需要处理成的数据格式 [{ mpptNumber: 1, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvEnableStatus: 0,pvSerialNumber: 2,}] }, { mpptNumber: 2, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvE…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了&#xff0c;这里不在熬述&#xff0c;它在LLM分析中&#xff0c;尤其是在语义相似度的计算中至关重要&#xff0c;在dot attention机制中&#xff0c;也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

Ubuntu机器安装rdkit指定版本,通过conda安装不需要make,有手就行。

阿里云购买Ubuntu 22.0机器 IP没错&#xff0c;访问外网没问题 图片中的命令放在下面了。 useradd test-user -s /bin/bash mkdir /home/test-user chown -R test-user: /home/test-user passwd test-uservi /etc/sudoers wget -c https://repo.anaconda.com/archive/Anacon…

全同态加密在大模型应用中应用

密码学简介 上文的图例基本展示了常见加密体系。加密体系&#xff0c;如果用比较正式的描述方法&#xff0c;无疑是做了三件事&#xff1a; 首先&#xff0c;通过一个生成算法 &#x1d43e;&#x1d452;&#x1d466;&#x1d43a;&#x1d452;&#x1d45b;(1&#x1d70…

小白学习手册:轻松理解MQ消息队列

目录 # 开篇 RabbitMQ介绍 通讯概念 1. 初始MQ及类型 2. MQ的架构 2.1 RabbitMQ的结构和概念 2.2 RabbitMQ消息流示意图 3. MQ下载使用 3.1 Docker下载MQ参考 3.2 进入RabbitMQ # 开篇 MessagesQueue 是一个抽象概念&#xff0c;用于描述消息队列系统的一般特性和功能…

计算机视觉 | 基于 PointNet 网络的飞机零件 3D 点云分割

目录 一、简要介绍二、环境设置2.1 实验配置2.2 必要库安装 三、数据集解析3.1 数据集加载3.2 数据文件夹结构3.3 点云数据可视化3.4 数据获取与预处理3.5 数据集定义 四、模型组网4.1 PointNet 介绍4.2 Paddle模型组网4.3 模型概要 五、模型训练六、模型预测七、总结 Hi&#…

亚马逊广告如何设置关键词竞价获取最优广告投入产出比 (ACOS)

在投放亚马逊商品广告的时候&#xff0c;从我们通常的理解来说&#xff0c;关键词竞价CPC设置的越高&#xff0c;广告投入产出比 (ACOS)越高&#xff0c;所以我们通常希望CPC越低越好&#xff0c;但是从我们实际投放广告来看&#xff0c;CPC与ACOS并不是线性相关。有时候CPC设定…

外卖点餐二合一小程序源码系统 单店多店都可使用 自由下单 带完整的安装代码包以及搭建部署教程

系统概述 外卖点餐二合一小程序源码系统是一款集外卖点餐和店铺管理功能于一体的综合性系统。它不仅适用于单店模式&#xff0c;也能满足多店连锁经营的需求。无论是小型餐厅还是大型餐饮企业&#xff0c;都可以通过该系统轻松实现线上业务的拓展和管理。 该系统基于先进的技…

69. x 的平方根(简单)

69. x 的平方根 1. 题目描述2.详细题解3.代码实现3.1 Python方法一&#xff1a;逐个遍历方法二&#xff1a;二分查找 3.2 Java 1. 题目描述 题目中转&#xff1a;69. x 的平方根 2.详细题解 不能使用系统内置的函数&#xff0c;寻找某个数&#xff08;假定为x&#xff09;的…

哈希表(C++实现)

文章目录 写在前面1. 哈希概念2. 哈希冲突3. 哈希函数4.哈希冲突解决4.1 闭散列4.1.1 线性探测4.1.2 采用线性探测的方式解决哈希冲突实现哈希表4.1.3 二次探测 4.2 开散列4.2.2 采用链地址法的方式解决哈希冲突实现哈希表 写在前面 在我们之前实现的所有数据结构中(比如&…

【详解】RV1106移植opencv-mobile库

文章目录 前言一、烧入镜像二、编译项目1.创建项目文件 三、移植四、运行文件五、总结 前言 硬件&#xff1a;瑞芯微Rv1106【Luckfox Pro\Max Pico、网线一根、USB线、串口助手、摄像头 软件&#xff1a;ubuntu 20.4 编译器&#xff1a;arm-rockchip830-linux-uclibcgnueabihf…