Codeforces Round 936 (Div. 2) ---- E. Girl Permutation ---- 题解 (数论)

E. Girl Permutation:

题目大意:

思路解析:

先理解什么是前缀最大值,他应该满足什么条件,根据定义可知对于 i 如果满足 所以 j < i,并且有 ai > aj,那么ai就是前缀最大值, 换言之如果数组 [a1, a2,a3,....,ai] ai是其中的最大值,那么ai就是前缀最大值。

对于后缀最大值有相反的定义, 如果存在数组 [ai,ai+1,ai+2,......,an] ai是其中的最大值,那么ai就是后缀最大值。

那么首先可以确定的是 a1一定是前缀最大值,an一定是后缀最大值。

题目又给出一个是前缀最大值的下标序列和是后缀最大值的下标序列。p数组和s数组,根据上诉分析,p0应该一定是1,sm2应该一定是n。并且pm1 一定等于 s0, 假设pm1 不等于 s0,根据上诉分析我们可以知道,全局最大值一定是前缀最大值和后缀最大值, 假设他的下标为5,那么根据分析 5之后的下标不可能再出现前缀最大值了,5之前的下标不可能出现后缀最大值,因为没有数能比全局最大值还大,那么就可以得出 pm1 一定等于 s0

那我们可以一开始就确定s0的值就为全局最大值,那么s0之前能选的数 就有_{n-1}^{s0-1}\textrm{}的情况,然后就可以这样将整个数组剩下的数分为两半,左右两边互不影响。那么有了这些数假设有k个,现在 1....pi-1....pi没有确定  那么先让pi拿到这k个数的最大值,pi-1拿到这k个数的次大值,然后 pi-1  + 1-- pi - 1在这k-2个数中任意选,然后这些数并且能按照任意顺序进行排列组合。右边类似,那么这样就统计出了每种情况。

代码实现:

import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
    static int inf = (int) 2e7;
    static int mod = (int) 1e9 + 7;
    static int maxN = (int) 2e5;
    static long[] fac = new long[maxN+5];
    static long[] inv = new long[maxN+5];



    public static void main(String[] args) throws IOException {
        fac[0] = 1;
        for (int i = 1; i <= maxN; i++) {
            fac[i] = fac[i-1] * i % mod;
        }
        inv[0] = 1;
        for (int i = 1; i <= maxN; i++) {
            inv[i] = qkm(fac[i]);
        }
        int t = f.nextInt();
        while (t > 0) {
            solve();
            t--;
        }

        w.flush();
        w.close();
        br.close();
    }

    public static void solve() {
        int n = f.nextInt(); int A = f.nextInt(); int B = f.nextInt();
        int[] a = new int[A]; int[] b = new int[B];
        for (int i = 0; i < A; i++) {
            a[i] = f.nextInt();
        }
        for (int i = 0; i < B; i++) {
            b[i] = f.nextInt();
        }
        if (a[0] != 1 || b[B-1] != n || a[A-1] != b[0]) {w.println(0); return;}
        else {
            long ans = cob(n-1, b[0] -1);
            for (int i = A - 2; i >= 0; i--) {
                ans = ans * cob(a[i+1] - 2, a[i+1] - a[i] - 1) % mod * fac[a[i+1] - a[i] - 1] % mod;
            }
            for (int i = 1; i < B; i++) {
                ans = ans * cob(n - b[i-1] - 1, b[i] - b[i-1] - 1) % mod * fac[b[i] - b[i-1] - 1] % mod;
            }
            w.println(ans);
        }
    }

    public static long cob(int n, int k){
        return fac[n] * inv[k] % mod * inv[n - k] % mod;
    }

    public static long qkm(long a){
        long b = mod - 2;
        long res = 1;
        while (b > 0){
            if ((b & 1) == 1) res = res * a % mod;
            b >>= 1;
            a = a * a % mod;
        }
        return res;
    }

    static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));
    static Input f = new Input(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public String nextLine() {
            String str = null;
            try {
                str = reader.readLine();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return str;
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public Double nextDouble() {
            return Double.parseDouble(next());
        }

        public BigInteger nextBigInteger() {
            return new BigInteger(next());
        }
    }
}

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

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

相关文章

大数据技术之 Apache Doris(一)

第 1 章 Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 10…

MySQL使用教程:数据库、表操作

目录 1. 免密码登录MySQL1.1 免密码配置1.2 登录选项介绍 2. MySQL基础配置&#xff1a;my.cnf3. 开机自启动设置&#xff08;可选设置&#xff09;4. 查看存储引擎5. 查看系统的编码规则和校验规则6. 数据库的操作6.1 查看数据库6.2 创建数据库 create database6.3 删除数据库…

九州金榜|面对校园霸凌,家长应该如何教育?

近期关于校园霸凌事件接连发生&#xff0c;前有邯郸时间&#xff0c;后有福建晋江一中学生因不忍被霸凌&#xff0c;选择跳楼轻生&#xff0c;面对此类事件&#xff0c;接连发生&#xff0c;孩子为什么会成为被霸凌的对象&#xff1f;家长应该如何教育孩子敢于对霸凌时说不。下…

【Java程序设计】【C00374】基于(JavaWeb)Springboot的社区疫情管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

Java Web-Tomcat

Web服务器 Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。 Tomcat&#xff0c;是一个 HTTP 服务器。我们只需要在服务器中安装一个Web服务器如Tomcat&#xff0c;然后就可以将…

js逆向之对称加密west交大登录密码

目录 js逆向之对称加密&west交大登录密码 什么是DES? 什么是AES? 实例演示--某大学官网 找加密? 关键字搜索 第一处: 找到其加密码代码 下断点 扣代码 这js代码怎么运行呢? 如何使用node运行js代码? 下载这个加密算法对象库 引用(对象) 传参 联动pyth…

Rancher介绍

1.什么是Rancher Rancher是一套容器管理平台&#xff0c;专门用于部署和管理容器化应用。以下是关于Rancher的详细介绍&#xff1a; 容器编排与管理&#xff1a;Rancher是一个开源的企业级容器管理平台&#xff0c;它支持Kubernetes作为其容器编排引擎。Rancher可以帮助用户在…

rust中常用cfg属性和cfg!宏的使用说明,实现不同系统的条件编译

cfg有两种使用方式&#xff0c;一种是属性&#xff1a; #[cfg()]&#xff0c;一种是宏&#xff1a;cfg! &#xff0c;这两个都是非常常用的功能。 #[cfg()]是 Rust 中的一个属性 用于根据配置条件来选择性地包含或排除代码。cfg 是 "configuration" 的缩写&#xf…

将markdown文档中的图床外链图片下载到本地文件夹

markdown图床外链图片下载到本地代码 前言 因为文章发到先知或者攻防社区需要本地图片&#xff0c;而我的图片从来都是上传到图床&#xff0c;所以编写了一个脚本实现了把markdown文章中所有含有外链图床的图片转储到本地的文件夹。 然后发布文章时再手动一个个上传图片。 如果…

Set和Map数据结构

Set和Map数据结构理解 Set&#xff1a; 1、es6新的数据结构&#xff0c;类似数组&#xff0c;但成员唯一 2、实例属性&#xff1a;Set.prototype.size返回Set实例的成员总数 3、操作方法&#xff1a;add、delete、has、clear 4、遍历操作&#xff1a;forEach、keys、values、en…

【研发日记】C/C++开发避坑秘籍(一)——CAN接收Buffer溢出Bug

文章目录 背景介绍 问题描述 分析排查 解决方案 总结归纳 背景介绍 在一个嵌入式软件项目中&#xff0c;有一段使用C语言写的嵌入式代码&#xff0c;功能是把CAN总线上的几帧报文接收进来&#xff0c;并解析出数据。示例如下&#xff1a; 乍一看感觉挺简单&#xff0c;想着…

全球前十大交易所KuCoin遭美司法部、CFTC起诉!违反银行保护法、反洗钱!交2200万“保护费”还不够?

昨&#xff08;26&#xff09;日晚间&#xff0c;美国司法部释出重磅消息&#xff0c;全球排名前十的中心化加密货币交易所KuCoin及其创始人Chun Gan和Ke Tang&#xff0c;遭到美国南区纽约地区检察官办公室起诉&#xff0c;理由是KuCoin及其两位创始人违反了美国反洗钱规范和未…

Mysql的高级语句3

目录 一、子查询 注意&#xff1a;子语句可以与主语句所查询的表相同&#xff0c;但是也可以是不同表。 1、select in 1.1 相同表查询 1.2 多表查询 2、not in 取反&#xff0c;就是将子查询结果&#xff0c;进行取反处理 3、insert into in 4、update…

el-table 表格全选

<template><div><el-checkbox v-model"checked" :disabledcheckedDis change"onAllSelectChange">全选</el-checkbox><el-table ref"multipleTable" :data"tableData" tooltip-effect"dark" sel…

面试八股文之JAVA基础

JAVA基础 DNS、CDN&#xff1f;如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层&#xff1f;应用层协议&#xff1f;http协议和https协议区别&#xff1f;传输层协…

Spring高级面试题-2024

Spring 框架中都用到了哪些设计模式&#xff1f; 1. 简单工厂&#xff1a; ○ BeanFactory&#xff1a;Spring的BeanFactory充当工厂&#xff0c;负责根据配置信息创建Bean实例。它是一种工厂模式的应用&#xff0c;根据指定的类名或ID创建Bean对象。2. 工厂方法&#xff…

插入排序和希尔排序:

插入排序 1. 算法思想&#xff1a; 由数组下标为1 开始的数值作为判断依据&#xff0c;与之前的数据从后往前比较定义tmp 暂存判断的数值&#xff0c;若前面的数据大于tmp&#xff0c;则将前面的数据向后移动 : arr[j1]arr[j]若对比的数据比tmp 大&#xff0c;则往后移&#…

展会邀约 |立仪科技邀您相聚四月

2024深圳国际传感器与应用技术展览会 2024年04月14日盛大开幕&#xff01; 立仪科技作为参展商 诚挚地邀请各地朋友莅临参观交流 2024成都国际工业展览会 2023年04月24-26日盛大开幕&#xff01; 立仪科技作为参展商 诚挚地邀请各地朋友莅临参观交流 深圳立仪科技有限公司…

Ubuntu上安装d4rl数据集

Ubuntu上安装d4rl数据集 D4RL的官方 github: https://github.com/Farama-Foundation/D4RL 一、安装Mujoco 1.1 官网下载mujoco210文件 如果装过可以跳过这步 链接&#xff1a;https://github.com/deepmind/mujoco/releases/tag/2.1.0 下载第一个文件即可。我这里是在windo…