CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

2024-05-23 23:52

本文主要是介绍CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目截图

在这里插入图片描述

题目翻译

在这里插入图片描述

题目分析

正难则反,考虑所有不符合的例子
由于n很小,所以可以状态压缩二进制遍历完全部不符合例子的组合
对于不符合的例子,假设其中第i个不符合,那么就消耗掉fi + 1个球
以此类推,减剩下s2个球
这时候使用隔板法分给n个箱子,加上n - 1个挡板,就是comb(s2 + n - 1, n - 1)
对于容斥原理,奇偶个数要对应不同的符号,这里需要注意

go代码

// LUOGU_RID: 159342370
package mainimport (. "fmt""io""math/bits""os"
)// https://space.bilibili.com/206214
func cf451E(in io.Reader, out io.Writer) {const mod = 1_000_000_007pow := func(x, n int) int {res := 1for ; n > 0; n /= 2 {if n%2 > 0 {res = res * x % mod}x = x * x % mod}return res}comb := func(n, k int) int {if n < k {return 0}n %= modp, q := 1, 1for i := 1; i <= k; i++ {p = p * (n - i + 1) % modq = q * i % mod}return p * pow(q, mod-2) % mod}var n, s, tot, ans intFscan(in, &n, &s)a := make([]int, n)for i := range a {Fscan(in, &a[i])tot += a[i]}if tot < s {Fprint(out, 0)return}for i := uint(0); i < 1<<n; i++ { // 表示这个组合中为1的盒子是超过ai个的(违法)s2 := sfor j, v := range a {if i>>j&1 > 0 {s2 -= v + 1 // 现分配ai+1个}}res := comb(s2+n-1, n-1)     // n-1个挡板表示分成n组,剩下s2个球if bits.OnesCount(i)%2 > 0 { // 根据个数确定正负号, 容斥原理res = -res}ans += res}Fprint(out, (ans%mod+mod)%mod)
}func main() { cf451E(os.Stdin, os.Stdout) }

快速幂以及组合数的go模版

const mod = 1_000_000_007
pow := func(x, n int) int {res := 1for ; n > 0; n /= 2 {if n%2 > 0 {res = res * x % mod}x = x * x % mod}return res
}
comb := func(n, k int) int {if n < k {return 0}n %= modp, q := 1, 1for i := 1; i <= k; i++ {p = p * (n - i + 1) % modq = q * i % mod}return p * pow(q, mod-2) % mod
}

总结

容斥原理的应用(根据个数,符号交替)

这篇关于CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro