[bzoj3622][DP][容斥原理]已经没有什么好害怕的了

2023-10-16 03:38

本文主要是介绍[bzoj3622][DP][容斥原理]已经没有什么好害怕的了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

4 2

5 35 15 45

40 20 10 30

Sample Output

4

HINT

输入的2*n个数字保证全不相同。

还有输入应该是第二行是糖果,第三行是药片

题解

DP呀..
从小到大排序
显然我们要找 n+k2 n + k 2 个糖果比药片大的组合
朴素dp方程,设 f[i][j] f [ i ] [ j ] 表示前 i i 个中找到j个合法组合 其它不管的数量
转移有

f[i][j]=f[i1][j]+f[i1][j1](pos[i]j+1) f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i − 1 ] [ j − 1 ] ∗ ( p o s [ i ] − j + 1 )

其中 pos[i] p o s [ i ] 表示 i i 最多能取到哪一位
会有重复
因为
a1>b1 a2>b2 a3>b3
选(a1,b1,a2,b2)和(a1,b1,a3,b3)会被判为两种不同情况
于是设g[i]表示 n n 个钟只有i个合法情况的状态数
转移有
g[i]=f[n][i](ni)!j=i+1ng[j] g [ i ] = f [ n ] [ i ] ∗ ( n − i ) ! − ∑ j = i + 1 n g [ j ]

前面表示只取i个,后面任选
然后去掉比i多的数目的算到i里的东西
就可以了。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define mod 1000000009
#define LL long long
using namespace std;
LL pow_mod(LL a,LL b)
{LL ret=1;while(b){if(b&1)ret=ret*a%mod;a=a*a%mod;b>>=1;}return ret;
}
LL inv[2005],pre[2005];
LL C(int n,int m){return pre[n]*inv[m]%mod*inv[n-m]%mod;}
int a[2005],b[2005],n,m,pos[2005];
LL f[2005][2005],g[2005];
void dl(LL &x,LL y){x-=y;if(x<0)x+=mod;}
int main()
{pre[0]=1;for(int i=1;i<=2000;i++)pre[i]=pre[i-1]*i%mod;inv[2000]=pow_mod(pre[2000],mod-2);for(int i=1999;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;scanf("%d%d",&n,&m);if((n+m)%2){puts("0");return 0;}m=(n+m)/2;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);sort(a+1,a+1+n);sort(b+1,b+1+n);int pa=0;for(int i=1;i<=n;i++){while(b[pa+1]<a[i]&&pa<n)pa++;pos[i]=pa;}f[0][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<=i;j++){if(j!=0)f[i][j]=(f[i-1][j]+f[i-1][j-1]*max(0,pos[i]-j+1))%mod;else f[i][j]=f[i-1][j];}for(int i=n;i>=m;i--){g[i]=f[n][i]*pre[n-i]%mod;for(int j=i+1;j<=n;j++)dl(g[i],g[j]*C(j,i)%mod);}printf("%lld\n",g[m]);return 0;
}

这篇关于[bzoj3622][DP][容斥原理]已经没有什么好害怕的了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218762

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node