美团笔试-小美的元素删除

2023-09-18 11:06:13

小美的元素删除

小美有一个数组,她希望删除k个元素,使得剩余的元素两两之间互为倍数关系。你能告诉小美有多少种删除方案吗?

由于答案过大,请对10^9+7模。

输入描述

第一行输入两个整数n,k(1<=k<=n<=10^3)表示数组长度,删除的元素数量。

第二行输入n,k个整数表示数组a(1<=ai<=10^9)。

保证给定的数组中不存在两个相等元素。

输出描述

输出一个整数表示答案。

示例1

输入

6 4
1 4 2 3 6 7

输出

8

说明

方案1:删除1,4,2,7。

方案2:删除1,4,3,7。

方案3:删除1,3,6,7。

方案4:删除4,2,3,6。

方案5:删除4,2,3,7。

方案6:删除4,2,6,7。

方案7:删除4,3,6,7。

方案8:删除2,3,6,7。

思路

我们先将所有的数从小到大进行排序,再记录每一个数的约数的索引

接着定义dp数组 :dp[i][j] = 为以i为结尾的,长度为j的数组中可以相约的数的数量

我们可以得到状态转移方程: dp[i][j] = 所有的dp[p][j-1]之和(p为i的约数)

最后我们累加 dp[i][n-k]即可。

代码

import java.util.*;

public class test {
    static final int MAXN = 1005;
    static final int MOD = 1000000007;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();

        int keep = n-k;

        int[] a = new int[MAXN];
        for(int i = 1 ;i<=n;i++){
            a[i] = scanner.nextInt();
        }

        Arrays.sort(a,1,n+1);
        List<Integer>[] yueshu = new ArrayList[MAXN];
        for(int i=1;i<=n;i++){
            yueshu[i] = new ArrayList<>();
        }

        for(int i=2;i<=n;i++){
            for(int j=1;j<i;j++){
                if(a[i]%a[j] == 0){
                    yueshu[i].add(j);
                }
            }
        }

//        定义dp[i][j] = 为以i为结尾的,长度为j的数组中可以相约的数的数量
        long[][] dp = new long[MAXN][MAXN];
        for(int i=1;i<=n;i++){
            dp[i][1] = 1;  //以i为结尾的,长度为1的数组中可以相约的数的数量为1
        }
        for(int i = 1;i<=n;i++){
            for (int j=2;j<=keep;j++){ // keep为需要保存的数字的个数
                for(int p : yueshu[i]){
                    dp[i][j] = dp[p][j-1] + dp[i][j];
                }
            }
        }

        int ans = 0;
        for (int i = 1;i<=n;i++){
            ans = (int) ((ans+dp[i][keep]) % MOD);
        }

        System.out.println(ans);
    }
}

更多推荐

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】一【题目类别】排序二【题目难度】中等三【题目编号】面试题10.11.峰与谷四【题目描述】在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整

io概述及其分类

一、IO概念•I/O即输入Input/输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;I:InputO:Output通过IO可以完成硬盘文件的读和写。•java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在http://java.i

PyTorch深度学习实战(13)——可视化神经网络中间层输出

PyTorch深度学习实战(13)——可视化神经网络中间层输出0.前言1.可视化特征学习的结果2.可视化第一个卷积层的输出3.可视化不同网络层的特征图小结系列链接0.前言随着深度学习的快速发展,神经网络已成为解决各种复杂任务的重要工具。然而,神经网络的黑盒特性使得我们对其内部运作过程和学到的表示仍然不够了解。为了更好地

spring并发读写数据库

spring并发读写数据库多线程写入数据库,事物通过AOP控制,无需影响业务代码存在几个小问题还不太理解有大佬看懂了麻烦点拨一下有好的优化代码思路欢迎交流代码当前仓库不能公开,代码下载文章目录spring并发读写数据库待解决问题基础实现原理单独任务实现通过AOP抽离事物控制的代码待解决问题//如果executor出现问

如何优化网站排名(百度SEO指南与优化布局方法)

百度SEO指南介绍:蘑菇号-www.mooogu.cn首先,为了提高网站的搜索引擎优化排名,需要遵循百度SEO指南的规则和标准。这包括使用符合规范的网站结构、页面内容的质量和与目标用户相关的关键词。避免使用非法技术和黑帽SEO的方法。增加百度SEO外链的四个步骤:第一步是寻找优质外链,例如与行业相关的网站、新闻媒体和知

kafkaStream实时流式计算

2实时流式计算2.1概念一般流式计算会与批量计算相比较。在流式计算模型中,输入是持续的,可以认为在时间上是无界的,也就意味着,永远拿不到全量数据去做计算。同时,计算结果是持续输出的,也即计算结果在时间上也是无界的。流式计算一般对实时性要求较高,同时一般是先定义目标计算,然后数据到来之后将计算逻辑应用于数据。同时为了提高

C++零基础教程(函数重载)

文章目录前言一、概念讲解二、代码示例三、函数指针遇到函数重载总结前言本篇文章来讲解函数重载,函数重载在C++中是非常重要的一个概念。一、概念讲解C++中的函数重载是指在同一个作用域中定义多个具有相同名称但参数列表不同的函数。函数重载允许使用相同的函数名来表示执行类似但具有不同参数类型或参数数量的操作。这样做可以提高代码

谷歌邀请企业测试人工智能工具Gemini;提升(LLM)性能的三种简单方法

🦉AI新闻🚀谷歌邀请企业测试人工智能工具Gemini,与微软展开竞争摘要:谷歌邀请企业测试其人工智能工具Gemini,该工具结合了GPT-4的文本生成能力,支持聊天对话、分析图表数据、创建图像以及用自然语言命令控制软件等功能。谷歌希望通过Gemini来为其消费类人工智能产品提供支持,同时与微软Azure等竞品展开正

Vue之路由及Node.js环境搭建(一起探索新事物)

目录​编辑前言一、Vue之路由1.路由简介1.1什么是路由1.2什么是SPA1.3SPA的实现思路1.4使用路由的优势2.案例演示2.1导入所需的js文件2.2编写案例代码(模拟页面跳转)二、Vue之node.js1.node.js简介1.1什么是node.js1.2node.js的特点1.3什么是npm1.4npm的

79、SpringBoot 整合 R2DBC --- R2DBC 就是 JDBC 的 反应式版本, R2DBC 是 JDBC 的升级版。

★何谓R2DBCR2DBC就是JDBC的反应式版本,R2DBC是JDBC的升级版。R2DBC是ReactiveRelationalDatabaseConnectivity(关系型数据库的响应式连接)的缩写反应式的就是类似于消息发布者和订阅者,有消息就进行推送。R2DBC中DAO接口中方法的返回值是Flux或Mono因此

嵌入式笔试面试刷题(day5 IIC详解)

文章目录前言一、IIC需要几根线分别是什么线二、IIC优势三、IIC可以挂载多少个从设备,主设备1.从设备数量2.主设备数量四、IIC是全双工还是半双工五、SDA和SCL为什么配置为上拉开漏输出模式1.为什么要配置为开漏输出不能是推挽输出a.实现线与功能b.保护设备不会被短路2.上拉电阻的作用a.确保空闲状态保持高电平

热文推荐