到哪查找网站域名夹江移动网站建设
web/
2025/9/27 8:03:24/
文章来源:
到哪查找网站域名,夹江移动网站建设,军事新闻最新24小时,免费网站引导页题目截图 题目翻译 题目分析
正难则反#xff0c;考虑所有不符合的例子 由于n很小#xff0c;所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子#xff0c;假设其中第i个不符合#xff0c;那么就消耗掉fi 1个球 以此类推#xff0c;减剩下s2个球 这时…题目截图 题目翻译 题目分析
正难则反考虑所有不符合的例子 由于n很小所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子假设其中第i个不符合那么就消耗掉fi 1个球 以此类推减剩下s2个球 这时候使用隔板法分给n个箱子加上n - 1个挡板就是comb(s2 n - 1, n - 1) 对于容斥原理奇偶个数要对应不同的符号这里需要注意
go代码
// LUOGU_RID: 159342370
package mainimport (. fmtiomath/bitsos
)// 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 1n; i { // 表示这个组合中为1的盒子是超过ai个的违法s2 : sfor j, v : range a {if ij1 0 {s2 - v 1 // 现分配ai1个}}res : comb(s2n-1, n-1) // n-1个挡板表示分成n组剩下s2个球if bits.OnesCount(i)%2 0 { // 根据个数确定正负号, 容斥原理res -res}ans res}Fprint(out, (ans%modmod)%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
}总结
容斥原理的应用根据个数符号交替
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82637.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!