Codeforces Round 258 (Div. 2) E. Devu and Flowers 生成函数

news2025/3/10 9:57:21

题目链接

题目大意

n n n ( 1 ≤ n ≤ 20 ) (1\leq n \leq 20) (1n20) 个花瓶,第 i i i 个花瓶里有 f i f_i fi ( 1 ≤ f i ≤ 1 0 12 ) (1\leq f_i \leq 10^{12}) (1fi1012) 朵花。现在要选择 s s s ( 1 ≤ s ≤ 1 0 14 ) (1\leq s \leq 10^{14}) (1s1014)朵花。

求出有多少种方案。两种方案不同当且仅当两种方案中至少有一个花瓶选择花的数量不同,答案对 1 0 9 + 7 10^9+7 109+7 取模。

思路

取第 i i i 种花的生成函数可以表示为 : f i ( x ) = f_i(x)= fi(x)= 1 + x + x 2 + x 3 + ⋅ ⋅ ⋅ x f i 1+x+x^2+x^3+ \cdot \cdot \cdot x^{f_i} 1+x+x2+x3+xfi.

则选取方案的生成函数可以表示为 : G ( x ) = G(x)= G(x)= f 1 ( x ) ⋅ f 2 ( x ) ⋅ ⋅ ⋅ f n ( x ) = f_1(x) \cdot f_2(x) \cdot \cdot \cdot f_n(x) = f1(x)f2(x)fn(x)= ( 1 − x f 1 + 1 ) ( 1 − x f 2 + 1 ) ( 1 − x f 3 + 1 ) ⋅ ⋅ ⋅ ( 1 − x f n + 1 ) ( 1 − x ) n \frac {(1-x^{f_1+1})(1-x^{f_2+1})(1-x^{f_3+1}) \cdot \cdot \cdot (1-x^{f_n+1})} {(1-x)^n} (1x)n(1xf1+1)(1xf2+1)(1xf3+1)⋅⋅⋅(1xfn+1) = = = ∏ i = 1 n ( 1 − x f i + 1 ) ( 1 − x ) n \frac {\prod_{i=1}^{n}(1-x^{f_i+1})}{(1-x)^{n}} (1x)ni=1n(1xfi+1) = = = ∏ i = 1 n ( 1 − x f i + 1 ) \prod_{i=1}^{n}(1-x^{f_i+1}) i=1n(1xfi+1) ⋅ \cdot ∑ i = 0 ∞ \sum_{i=0}^\infty i=0 ( i + n − 1 i ) {i+n-1\choose i} (ii+n1) x i x_i xi = = = ∏ i = 1 n ( 1 − x f i + 1 ) \prod_{i=1}^{n}(1-x^{f_i+1}) i=1n(1xfi+1) ⋅ \cdot ∑ i = 0 ∞ \sum_{i=0}^\infty i=0 ( i + n − 1 n − 1 ) {i+n-1\choose n-1} (n1i+n1) x i x_i xi .

[ x s ] G ( x ) [x^s]G(x) [xs]G(x)即为所求的答案。

A ( x ) = ∏ i = 1 n ( 1 − x f i + 1 ) A(x)=\prod_{i=1}^{n}(1-x^{f_i+1}) A(x)=i=1n(1xfi+1), B ( x ) = ∑ i = 0 ∞ B(x)=\sum_{i=0}^\infty B(x)=i=0 ( i + n − 1 n − 1 ) x i {i+n-1\choose n-1} x_i (n1i+n1)xi.

由于 n ≤ 20 n\leq20 n20 , 所以 A ( x ) A(x) A(x) 最多只有 2 20 2^{20} 220 项,可以直接枚举,即 a n s = [ x s ] G ( x ) = ∑ i = 0 2 n [ x i ] A ( x ) ⋅ [ x s − i ] B ( x ) = ans=[x^s]G(x)=\sum_{i=0}^{2^n}[x^i]A(x) \cdot [x^{s-i}]B(x)= ans=[xs]G(x)=i=02n[xi]A(x)[xsi]B(x)= ∑ i = 0 2 n [ x i ] A ( x ) ⋅ ( s − i + n − 1 n − 1 ) \sum_{i=0}^{2^n}[x^i]A(x) \cdot {s-i+n-1\choose n-1} i=02n[xi]A(x)(n1si+n1),由于 n n n 很小可以暴力计算组合数,总的时间复杂度为 O ( n ⋅ 2 n ) O(n \cdot 2^n) O(n2n).

code

#include <bits/stdc++.h>
#define int long long
#define ll long long
#define pii pair<int, int>

using namespace std;
const int mod = 1e9 + 7;
int f[30];

int ksm(int x, int k)
{
    int res = 1;
    while (k > 0)
    {
        if (k & 1)
            res = res * x % mod;
        x = x * x % mod;
        k >>= 1;
    }
    return res;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, s;
    cin >> n >> s;
    int fac = 1;
    for (int i = 1; i <= n; ++i)
    {
        cin >> f[i - 1];
        if (i < n)
            fac = fac * i % mod;
    }
    int infac = ksm(fac, mod - 2);
    int ans = 0;
    for (int i = 0; i < (1ll << n); ++i)
    {
        int cnt = 0, sum = 0;
        for (int j = 0; j < n; ++j)
        {
            if ((1ll << j) & i)
                cnt++, sum += f[j] + 1;
        }
        if (sum > s)
            continue;
        int tmp = 1;
        for (int j = 0; j < n - 1; ++j)
        {
            int p = (s - sum + n - 1 - j) % mod;
            tmp = tmp * p % mod;
        }
        tmp = tmp * infac % mod;
        ans = (ans + ((cnt & 1) ? mod - tmp : tmp) % mod) % mod;
    }
    cout << (ans + mod) % mod << '\n';
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

子数组、子串系列(典型算法思想)—— OJ例题算法解析思路

一、53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; class Solution { public:int maxSubArray(vector<int>& nums) {// 1. 创建 dp 表// dp[i] 表示以第 i 个元素结尾的子数组的最大和int n nums.size();vector<int> dp(n…

Windows编程----进程的当前目录

进程的当前目录 Windows Api中有大量的函数在调用的时候&#xff0c;需要传递路径。比如创建文件&#xff0c;创建目录&#xff0c;删除目录&#xff0c;删除文件等等。拿创建文件的CreateFile函数做比喻&#xff0c;如果我们要创建的文件路径不是全路径&#xff0c;那么wind…

AVL树的介绍及实现

文章目录 &#xff08;一&#xff09;AVL的概念&#xff08;二&#xff09;AVL树的实现1.AVL树的结构2.AVL树的插入3.AVL树的查找 &#xff08;三&#xff09;检查一棵树是否是AVL树 &#xff08;一&#xff09;AVL的概念 AVL树是一棵高度平衡的二叉搜索树&#xff0c;通过控制…

快速生成viso流程图图片形式

我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制&#xff0c;viso这个软件大部分技术人员都会使用&#xff0c;但是想要画的好看&#xff0c;画的科学还是比较难的&#xff0c;现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…

【极光 Orbit•STC8A-8H】03. 小刀初试:点亮你的LED灯

【极光 Orbit•STC8H】03. 小刀初试&#xff1a;点亮你的 LED 灯 七律 点灯初探 单片方寸藏乾坤&#xff0c;LED明灭见真章。 端口配置定方向&#xff0c;寄存器值细推敲。 高低电平随心控&#xff0c;循环闪烁展锋芒。 嵌入式门初开启&#xff0c;从此代码手中扬。 摘要 …

OSPF报文分析

OSPF报文分析 组播地址 224.0.0.0&#xff5e;224.0.0.255为预留的组播地址&#xff08;永久组地址&#xff09;&#xff0c;地址224.0.0.0保留不做分配&#xff0c;其它地址供路由协议使用&#xff1b; 224.0.1.0&#xff5e;238.255.255.255为用户可用的组播地址&#xff08;…

MySql性能(9)- mysql的order by的工作原理

全字段排序rowid排序全字段排序和rowid排序 3.1 联合索引优化 3.2 覆盖索引优化优先队列算法优化建议 5.1 修改系统参数 5.2 优化sql 1. 全字段排序 CREATE TABLE t ( id int(11) NOT NULL,city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL,addr v…

爬虫案例七Python协程爬取视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例七协程爬取视频 提示&#xff1a;以下是本篇文章正文…

智慧城市智慧社区项目建设方案

一、项目背景 在全球化进程加速的今天&#xff0c;城市化问题日益凸显&#xff0c;传统的城市管理模式已难以满足现代社会对高效、智能化管理的需求。智慧城市和智慧社区的概念应运而生&#xff0c;其核心目标是通过信息技术手段&#xff0c;提升城市资源的利用效率&#xff0…

RabbitMQ高级特性--消息确认机制

目录 一、消息确认 1.消息确认机制 2.手动确认方法 二、代码示例 1. AcknowledgeMode.NONE 1.1 配置文件 1.2 生产者 1.3 消费者 1.4 运行程序 2.AcknowledgeMode.AUTO 3.AcknowledgeMode.MANUAL 一、消息确认 1.消息确认机制 生产者发送消息之后&#xff0c;到达消…

Java EE 进阶:Spring IoCDI

IOC的简单介绍 什么是Spring&#xff1f;Spring是一个开源的框架&#xff0c;让我们的开发更加的简单&#xff0c;我们可以用一句更加具体的话来概括Spring&#xff0c;就是Spring是一个包含众多工具方法的IOC容器。 简单介绍一下IOC&#xff0c;我们之前说过通过ReqestContr…

Java数据结构第二十期:解构排序算法的艺术与科学(二)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、常见排序算法的实现 1.1. 直接选择排序 1.2. 堆排序 1.3. 冒泡排序 1.4. 快速排序 一、常见排序算法的实现 1.1. 直接选择排序 每⼀次从待排序的数据元素中选出最小的⼀个元素&#xff0c;存放在…

【算法day5】最长回文子串——马拉车算法

最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 https://leetcode.cn/problems/longest-palindromic-substring/description/ 算法思路&#xff1a; class Solution { public:string longestPalindrome(string s) {int s_len s.size();string tmp …

《如何排查Linux系统平均负载过高》

【系统平均负载导读】何为系统平均负载&#xff1f;假设一台云服务主机&#xff0c;突然之间响应用户请求的时间变长了&#xff0c;那么这个时候应该如何去排查&#xff1f;带着这个问题&#xff0c;我们对“平均负载”展开深入的探讨和研究。 何为Linux系统的平均负载&#xf…

基于DeepSeek实现PDF嵌入SVG图片无损放大

1. PDF中效果图 2. 询问Deepseek进行代码书写&#xff0c;不断优化后结果 /*** SVG工具类&#xff0c;用于生成价格趋势的SVG图表*/ public class SvgUtils {// SVG画布尺寸private static final int WIDTH 800;private static final int HEIGHT 500;private static final i…

整型的不同类型和溢出

一、整数的不同类型 不同编程语言中的整数类型主要通过以下两个维度区分&#xff1a; 1. 存储大小 字节数&#xff1a;决定整数能表示的范围&#xff08;如 1字节8位&#xff09;。 常见类型&#xff1a; byte&#xff08;1字节&#xff09;、short&#xff08;2字节&#x…

使用express创建服务器保存数据到mysql

创建数据库和表结构 CREATE DATABASE collect;USE collect;CREATE TABLE info (id int(11) NOT NULL AUTO_INCREMENT,create_date bigint(20) DEFAULT NULL COMMENT 时间,type varchar(20) DEFAULT NULL COMMENT 数据分类,text_value text COMMENT 内容,PRIMARY KEY (id) ) EN…

小程序 wxml 语法 —— 41列表渲染 - 进阶用法

这一节讲解列表渲染的两个进阶用法&#xff1a; 如果需要对默认的变量名和下标进行修改&#xff0c;可以使用 wx:for-item 和 wx:for-item&#xff1a; 使用 wx:for-item 可以指定数组当前元素的变量名使用 wx:for-index 可以指定数组当前下标的变量名 将 wx:for 用在 标签上&…

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…

FPGA学习篇——Verilog学习5(reg,wire区分及模块例化)

1 何时用reg&#xff0c;何时用wire&#xff1f; 这个我找了一些网上的各种资料&#xff0c;大概说一下自己的理解&#xff0c;可能还不太到位... wire相当于一根线&#xff0c;是实时传输的那种&#xff0c;而reg是一个寄存器&#xff0c;是可以存储数据的&#xff0c;需要立…