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

相关文章

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景