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

news2024/12/27 11:21:12

题目链接

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;
    }
};

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

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

相关文章

Esxi硬件日志告警

原创作者&#xff1a;运维工程师 谢晋 Esxi硬件日志告警 故障描述故障处理 故障描述 主机报错硬件对象状态告警 在Esxi监控硬件内发现Systemctl Manager Module 1 Event log 0报警&#xff0c;该报警是Esxi事件日志保存空间满了&#xff0c;需要清理空间。 故障处理 开启…

整除分块的题目

链接 思路&#xff1a; 求1到n中的因数个数和等价于求,设x为因子&#xff0c;就是求x在1到n里出现了几次&#xff0c;求1到n里是x的倍数的数有几个&#xff0c;即n/x。需要用整除分块&#xff0c;n/i的值是分块分部的&#xff0c;右端点是n/&#xff08;n/i&#xff09;。 代…

相机网线RJ45连接器双端带线5米8芯绿色网线注塑成型

相机网线RJ45连接器双端带线5米8芯绿色网线注塑成型&#xff0c;这款网线采用了环保的绿色材质&#xff0c;线长5米&#xff0c;足够满足大多数拍摄场景的需求。更重要的是&#xff0c;它采用了8芯设计&#xff0c;保证了数据传输的稳定性和高速性。在接口方面&#xff0c;它采…

转转回收的持久层架构演进

1 前言 我们在大部分开发场景下&#xff0c;对持久层的建设基于单库单表其实就可以实现当前的产品需求。但是随着业务发展越来越久&#xff0c;数据量、请求量也在不断的增加&#xff0c;只是单库单表可能不足以支撑系统的稳定运行&#xff0c;本文主要给大家分享一下笔者在项…

mac安装达梦数据库

参考&#xff1a;mac安装达梦数据库​​​​​​ 实践如下&#xff1a; 1、下载达梦Docker镜像文件 同参考链接 2、导入镜像 镜像可以随便放在某个目录&#xff0c;相当于安装包&#xff0c;导入后就没有作用了。 查找达梦镜像名称&#xff1a;dm8_20240613_rev229704_x86…

EHS管理系统避坑指南!这几个关键点需要注意!

在企业管理中&#xff0c;环境、健康和安全&#xff08;EHS&#xff09;占据着举足轻重的地位&#xff0c;而EHS管理系统则是推动EHS管理走向高效与规范的核心工具。因此&#xff0c;选择一个与企业需求相契合的EHS管理系统&#xff0c;对于维护员工健康、保护环境安全以及提升…

C#——Property属性详情

属性 属性&#xff08;Property&#xff09;是类&#xff08;class&#xff09;、结构体&#xff08;structure&#xff09;和接口&#xff08;interface&#xff09;的成员&#xff0c;类或结构体中的成员变量称为字段&#xff0c;属性是字段的扩展&#xff0c;使用访问器&am…

算法实验2.2、2.3

2.2主要内容 比较快速排序&#xff0c;归并排序以及堆排序算法的时间效率。了解影响算法执行时间的 主要因素以及如何降低算法的执行时间。 #include<iostream> using namespace std; #include<stdio.h> #include<malloc.h> #include<stdlib.h> #inc…

Gradle学习-4 创建二进制插件工程

二进制插件工程创建有两种方式&#xff1a; 创建独立的工程&#xff0c;调试的时候&#xff0c;需要手动发布成一个二进制插件jar包&#xff0c;给其他工程里面引用&#xff0c;进行功能测试。这种方式是比较麻烦的。创建buildSrc子工程&#xff0c;它是一个大工程中的子工程&…

C语言之线程的学习

线程属于某一个进程 共同点&#xff1a;都能并发 线程共享变量&#xff0c;进程不共享。 多线程任务中&#xff0c;其中某一个线程调用了exit了&#xff0c;其他线程会跟着一起退出 如果是特定的线程就调用pthread_exit 失败返回的是错误号 下面也是

基于JSP技术的校园餐厅管理系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果您对校园餐厅管理系统感兴趣或有相关需求&#xff0c;欢迎随时联系我。我的联系方式在文末&#xff0c;期待与您交流&#xff01; 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#x…

Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)

Redis 中的通用命令(高频率操作) 文章目录 Redis 中的通用命令(高频率操作)Redis 的数据类型redis-cli 命令Keys 命令Exists 命令Expire 命令Ttl 命令Type命令 Redis 的数据类型 Redis 支持多种数据类型&#xff0c;整体来说&#xff0c;Redis 是一个键值对结构的&#xff0c;…

深入解析 androidx.databinding.Bindable 注解

在现代 Android 开发中&#xff0c;数据绑定 (Data Binding) 是一个非常重要的技术。它使得我们能够简化 UI 和业务逻辑之间的连接&#xff0c;从而提高代码的可读性和维护性。在数据绑定中&#xff0c;Bindable 注解是一个关键部分&#xff0c;它帮助我们实现双向数据绑定和自…

什么是脏读、幻读、不可重复读

数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;以保持数据库的一致性和完整性。在多线程或多用户同时操作时&#xff0c;难免会出现错乱与冲突&#xff0c;这就需要引入事务的…

零成本、高效率:免费可视化工具的魅力所在

在如今这个数据驱动的时代&#xff0c;免费可视化工具越来越受到人们的欢迎。这些工具不仅降低了数据分析的门槛&#xff0c;还为用户提供了强大的功能和极高的灵活性&#xff0c;使得各行各业的人们都能够轻松地利用数据做出明智的决策。首先&#xff0c;免费可视化工具的零成…

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOP SpringBoot与AOP 使用AOP实现用户接口访问日志功能 添加AOP场景启动器 <!--添加AOP场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</…

使用Pogo-DroneCAN CANHUB扩展板扩展飞控的CAN口

关键词&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN CANHUB扩展&#xff0c;扩展飞控CAN口 keywords&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN CANHUB Extend 摘要&#xff1a;使用Pogo-DroneCAN CANHUB扩展板扩展飞控CAN口&#xff…

数据挖掘常见算法(分类算法)

K&#xff0d;近邻算法&#xff08;KNN&#xff09; K-近邻分类法的基本思想&#xff1a;通过计算每个训练数据到待分类元组Zu的距离&#xff0c;取和待分类元组距离最近的K个训练数据&#xff0c;K个数据中哪个类别的训练数据占多数&#xff0c;则待分类元组Zu就属于哪个类别…

五分钟了解MQ消息集成

一、MQ消息集成的定义 MQ消息集成是通过消息中间件&#xff08;Message Queue&#xff09;实现的一种数据集成方式。它通过将数据发送到中间件中&#xff0c;再从中间件中接收数据&#xff0c;实现不同系统之间的数据交换。在MQ消息集成中&#xff0c;发送者和接收者之间不需要…

(六)Shader

Shader Shader(着色器)&#xff1a;一种运行在GPU端的类C语言GLSL&#xff0c;用于处理顶点数据以及决定像素片元最终着色。 Shader对三角形数据的处理&#xff0c;分为顶点处理和片元处理&#xff0c;分别称为顶点着色器(Vertex Shader)和片元着色器(Fragment Shader) GLSL …