子序列(组合数学)

2023-11-11

子序列


题目描述

给出一个长度为 n n n的序列,你需要计算出所有长度为 k k k的子序列中,除最大最小数之外所有数的乘积相乘的结果

输入描述:

第一行一个整数 T T T,表示数据组数。
对于每组数据,第一行两个整数 N N N k k k,含义如题所示
接下来一行 N N N个整数,表示给出的序列
保证序列内的数互不相同

输出描述:

对于每组数据,输出一个整数表示答案,对 1 0 9 + 7 10^9 + 7 109+7取模
每组数据之间以换行分割

示例1

输入

3
4 3
5 3 1 4
5 4
3 7 5 2 1
10 3
100 1020 2050 102 12 235 4 57 32135 54354

输出

144
81000
521918013

说明

第一组数据解释
所有长度为 3 3 3的子序列为 ( 5 , 3 , 1 ) ( 5 , 3 , 4 ) ( 3 , 1 , 4 ) ( 5 , 1 , 4 ) (5, 3, 1) (5, 3, 4) (3, 1, 4) (5, 1, 4) (5,3,1)(5,3,4)(3,1,4)(5,1,4)
最终答案为 3 ∗ 4 ∗ 3 ∗ 4 = 144 3*4*3*4 =144 3434=144

备注:

对于 30 30% 30数据: T ⩽ 10 , N ⩽ 100 , k ⩽ N T \leqslant 10, N \leqslant 100, k \leqslant N T10,N100,kN
对于 60 % 60 \% 60%的数据: T ⩽ 10 , N ⩽ 1000 , k ⩽ N T \leqslant 10, N \leqslant 1000, k \leqslant N T10,N1000,kN
对于 100 % 100 \% 100%的数据: T ⩽ 1000 , N ⩽ 1000 , k ⩽ N T \leqslant 1000, N \leqslant 1000, k \leqslant N T1000,N1000,kN
保证序列中的元素互不相同且 ⩽ 1 0 6 \leqslant 10^6 106 k ⩾ 3 k \geqslant 3 k3

解决思路

提示
1、 a b % m o d a^b\%mod ab%mod,当 m o d mod mod是素数时,在计算 b b b时一定要对 ( m o d − 1 ) (mod-1) (mod1)取模——欧拉降幂。
2、组合数学题,正向不好算时,一定要考虑容斥,别硬卡!!!

已知:见题意。
求解:首先对数排个序,通过枚举可能产生贡献的数计算贡献,存在贡献的数的区间为 [ 2 , n − 1 ] [2,n-1] [2,n1]
不难想到,计算贡献次数需要用到容斥原理。
对于每个数来说,这个数的贡献次数 = = = 所有含这个数的子序列的个数 − - 含这个数并且这个数是子序列的最小值的个数 − - 含这个数并且这个数是子序列的最大值的个数

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long ll;
const int N = 1e3 + 10;
const int mod = 1e9 + 7;

int C[N][N];
int u[N];

ll qpow(ll a, ll b, ll p) {
    ll res = 1;
    while (b) {
        if (b & 1) {
            res = res * a % p;
        }
        a = a * a % p;
        b >>= 1;
    }
    return res;
}
void init(const int n) {
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0 || i == j) C[i][j] = 1;
            else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % (mod - 1);
        }
    }
}

int main() {

    init(1e3);
    
    int T; cin >> T;
    
    while (T--) {
        int n, k; scanf("%d %d", &n, &k);
        for (int i = 1; i <= n; i++) scanf("%d", &u[i]);
        
        sort(u + 1, u + n + 1);
        
        ll ans = 1;
        for (int i = 2; i <= n - 1; i++) {
            ll t = C[n - 1][k - 1] - C[i - 1][k - 1] - C[n - i][k - 1];
            t = (t % (mod - 1) + (mod - 1)) % (mod - 1);
            ans = ans * qpow(u[i], t, mod) % mod;
        }
        
        printf("%lld\n", ans);
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子序列(组合数学) 的相关文章

  • 静态链接和动态链接的区别

    在理解静态和动态 共享 库链接之间的区别之前 让我们先看一个典型程序的生命周期 从编写源代码到执行它 首先使用任何程序员选择的编辑器以文本文件的形式编写程序 然后必须对其进行编译以将文本文件转换为机器可以理解和执行的目标代码 通常我们编写的
  • 1216项目设计模板

    一 基本信息 目标上线时间 yyyy mm dd 项目人员 研发 测试 背景 二 功能需求 1 业务平台 1 业务的订购 配置默认的模板或者策略 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img I8vhSe47
  • 最全的Pandas 日期处理 超强总结!

    对于 Pandas 来说 可以处理众多的数据类型 其中最有趣和最重要的数据类型之一就是时间序列数据 时间序列数据无处不在 它在各个行业都有很多应用 患者健康指标 股票价格变化 天气记录 经济指标 服务器 网络 传感器和应用程序性能监控都是时
  • leetcode-135-分发糖果

    老师想给孩子们分发糖果 有 N 个孩子站成了一条直线 老师会根据每个孩子的表现 预先给他们评分 你需要按照以下要求 帮助老师给这些孩子分发糖果 每个孩子至少分配到 1 个糖果 相邻的孩子中 评分高的孩子必须获得更多的糖果 那么这样下来 老师
  • SpringBoot 集成sharding-jdbc 提示:Failed to configure a DataSource: ‘url‘ attribute is not specified ***

    问题描述 今天使用SpringBoot 集成sharding jdbc 4 1 1实现分库分表时报错 APPLICATION FAILED TO START Description Failed to configure a DataSou
  • 记录一次因now()函数应用周期性查不到数据的问题

    问题原因 查询sql使用了now 函数 测试环境数据库所在的容器日期不对 与实际时间晚8个小时 问题背景描述 某天下午快要下班的时候 大概五点的样子 某个测试小哥在系统里点击用户注册功能注册后 一切数据都正常生成后 登录新注册的用户 发现这
  • 基础算法题——Radio Transmission(KMP-next 妙用)

    Radio Transmission 解题思路 在KMP算法中 next l 记录的就是字符串最长的相同的前缀与后缀 也就是说在题目字符串中有一段字符串是重复出现的 那么减去重复出现的字符串以后 剩下的就是这个字符串最小的循环节 比较字符串
  • 19.RV1126_RV1109编写并移植nvp6021驱动

    文章目录 前言 确定硬件 配置设备树生成节点 前言 nvp6021是一个i2C器件 因此 应该编写I2C设备驱动 既然是I2C设备驱动 应该确定的有 使用的是哪一路I2C I2C设备地址是多少等 确定硬件 使用的是哪一路I2C 从上面可以看
  • 动态规划算法与典型例题

    目录 前言 一 动态规划要素 条件 二 动态规划算法设计步骤 三 复杂度分析 四 典型例题1 游艇租聘 五 典型例题2 0 1背包问题 六 典型例题3 跳台阶问题 七 典型例题4 强盗抢劫问题 总结 前言 动态规划也是一种分治思想 分治算法
  • html 在html文件中循环遍历数组并展示

    用html文件实现一个简单的遍历数组并输出到页面上面
  • unixbench测试CPU性能工具/mbw测试内存

    一 unixbench工具 UnixBench是一个类unix系 Unix BSD Linux 统下的性能测试工具 一个开源工具 被广泛用与测试linux系统主机的性能 Unixbench的主要测试项目有 系统调用 读写 进程 图形化测试

随机推荐

  • 【碎碎念随笔】1、回顾我的电脑和编程经历

    闲着无事 讲述一下我的计算机和代码故事 一 初识计算机 余家贫 耕植无钱买电脑 大约六年级暑假 我在姐姐哪儿第一次接触到了计算机 姐姐也是买的二手 计算机真有趣 在我眼中 计算机上寒假了世界上的好东西 是个聚宝盆 在计算机上 可以打小游戏
  • 对象之间的关系

    目录 1 依赖 2 关联 3 聚合 4 组合 5 继承 6 实现 Java的对象 类之间有四种关系 依赖 关联 组合 聚合 继承 实现 1 依赖 依赖 Dependency 一个对象的功能依赖于另一个对象 类比 人类生存依赖食物和空气 体现
  • 在C++遇到有些关键字或者函数被弃用的情况,比如xxx was declared deprecated

    在C 遇到有些关键字或者函数被弃用的情况 随着每一次C 的不断更新 可能都会有些函数或者关键字会被弃用 或者换成了其他的名字 这在编写代码的时候经常会碰到 碰到这种情况 可以在代码的第一行写上忽略此错误的句子 一般为 pragma warn
  • redis之如何配置jedisPool参数

    如何配置Pool的参数 JedisPool的配置参数很大程度上依赖于实际应用需求 软硬件能力 JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的 maxActive 控制一个pool可分配多少个jedis实
  • 项目管理在公司的主要作用是什么?

    项目管理不光是需要公司的支持和承接项目就可以的 还需要项目管理者多方面的把控 以及执行才会达到更好 那么项目管理的主要作用是什么了 1 提升项目本身的经济效益 项目管理通过对时间 成本的掌控 达到项目的经济效益最大化 保证了公司的良性发展
  • Ansible安装部署

    Ansible安装部署 Ansible概述 Ansible的作用 Ansible工作原理 Ansible的特点 Ansible安装部署 环境准备 管理端安装ansible 配置主机清单 ansible 命令行模块 1 command 模块
  • 基于时间序列的短期数据预测--ARMA模型的设计与实现(每个步骤附实现源码)

    本文demo源码 实验数据 传送门 引言 前面我有分享两篇关于时间序列模型的文章 一篇是 Holt Winters模型原理分析及代码实现 python 一篇是 LSTM模型分析及对时序数据预测的具体实现 python实现 holt wint
  • win32api.sendmessage模拟鼠标点击_安卓模拟器一键宏设置教程

    一 什么是一键宏 一键宏是指宏指令 主要作用是一键触发多个点击事件 游戏玩家可以用来设置一键连招 一键发言等功能 因此成为一键宏 二 如何设置一键宏 打开雷电模拟器 点击右侧栏按键按钮 找到 一键宏 按钮 点击拖拉到模拟器窗口你想摆放的位置
  • 【Spring Cloud】分布式必学springcloud(五)——Ribbon自定义负载均衡策略

    一 前言 在上一篇博客中 小编向大家介绍了负载均衡工具Ribbon 是不是很颠覆呀 是不是很好用呀 从中大家有没有感觉到他的负载均衡策略呀 对的 Ribbon内置的默认策略是轮询 在这篇博客中 小编就带大家领略一下Ribbon自定义策略 二
  • 计算机信息单位换算中的t是,算力单位换算(算力单位t)

    算力每隔千位划为一个单位 最小单位 H 1次 1000H 1K 1000K 1G 1000G 1T 1000T 1P 1000P 1E 1公斤力等于多磅力 n牛 顿 是力的国际单位 kg千克 是质量的国际单位 这两个单位可以通过加速度计算
  • 腾讯自选股任务 青龙脚本

    有python环境可以运行 青龙也可以运行 添加脚本自己定时规则 修改环境变量位自己的 加入进去即可 更新时间 2022 6 2 有python环境可以运行 青龙也可以运行 添加脚本自己定时规则 修改环境变量位自己的 加入进去即可 更新时间
  • Android的Context详解 - 揭开Context的神秘面纱

    这篇文章是基于我四年前的一篇文章进行更正和深入探究 背景是 2019年4月份我在找工作 看到一个问题 问this getBaseContext getApplication getApplicationContext 的区别 当时我写了简单
  • dn什么意思_钢管中的DN表示什么意思?

    展开全部 DN是一种工程通径 不是实际的数值 由于各国标准不同 所以相对应的实际数值就不一样 扩展资e69da5e6ba903231313335323631343130323136353331333365666137料 DN既不是外径 也不
  • Java中int(Integer)类型与long(Long)类型数据的相互转化

    新手开车 先上代码 后边解析 能看懂代码就不要看解析 PS 命名规范 i代指int类型 l代指long类型 I代指Integer类型 L代指Long类型 2 transferTo 首先创建四个基本操作对象 Long L0 123456l i
  • java浮点数转二进制_浮点数转换成二进制

    因为要参加软考了 当然也只有考试有这种魅力 我得了概浮点数转化为二进制表示这个最难的知识点 个人认为最难 俺结合大量的从网上收集而来的资料现整理如下 希望对此知识点感兴趣的pfan有所帮助 基础知识 十进制转十六进制 十六进制转二进制 IE
  • Git恢复本地误删文件

    转 https www cnblogs com yangshifu p 9680993 html Step 1 git status Step 2 git reset HEAD 被删除的文件或文件夹 Step 3 git checkout
  • vuex 是什么? 有哪几种属性?

    Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 简单点说 方便父子组件及组件之间的数据传递 有 5 种 分别是 state getter mutation action module vuex 的 store 是什么 vue
  • MIDP对应的设备特性(转)

    由于MID这类设备 在屏幕 内存 处理器等问题上有诸多限制 在手机或是PDA等MID上开发应用程序必须要考虑一些技术上的特殊点 下面给出一些MID设备的特性 显示 display 96x54 最小屏幕尺寸 1bit 最小色深 单色 输入设备
  • 工具网页收藏

    腾讯文档 百度脑图 墨者写书 语雀文档 阿里图标库 百度图说 腾讯智图 百度Suger数据可视化 腾讯设计导航 135设计 极速app 小程序开发 墨刀 processon visio axure mockplus sketchcn 其他i
  • 子序列(组合数学)

    子序列 题目描述 给出一个长度为 n n n的序列 你需要计算出所有长度为 k k k的子序列中 除最大最小数之外所有数的乘积相乘的结果 输入描述 第一行一个整数