当前位置: 首页 > news >正文

洛谷 P10112 [GESP202312 八级] 奖品分配-普及/提高-

题目描述

班上有 NNN 名同学,学号从 000N−1N-1N1。有 MMM 种奖品要分给这些同学,其中,第 iii 种奖品总共有 aia_iai 个 (i=0,1,⋯ ,M−1i=0,1, \cdots ,M-1i=0,1,,M1)。

巧合的是,奖品的数量不多不少,每位同学都可以恰好分到一个奖品,且最后剩余的奖品不超过 111 个(即:N≤a0+a1+⋯+aM−1≤N+1N\le a_0+a_1+ \cdots +a_{M-1}\le N+1Na0+a1++aM1N+1)。

现在,请你求出每个班级礼物分配的方案数,所谓方案,指的是为每位同学都分配一个种类的奖品。

只要有一位同学获得了不同种类的奖品,即视为不同的方案。方便起见,你只需要输出方案数对 109+710^{9}+7109+7 取模后的结果即可。

共有 TTT 个班级都面临着奖品分配的问题,你需要依次为他们解答。

输入格式

第一行一个整数 TTT,表示班级数量。

接下来 TTT 行,每行若干用单个空格隔开的正整数。首先是两个正整数N,MN,MN,M,接着是 MMM 个正整数 a0,a1...aM−1a_0,a_1...a_{M-1}a0,a1...aM1。保证 $N \le a_0+a_1+\cdots+a_{M-1} \le N+1 $。

输出格式

输出 TTT 行,每行一个整数,表示该班级分配奖品的方案数对 109+710^{9}+7109+7 取模的结果。

输入输出样例 #1

输入 #1

3
3 2 1 2
3 2 1 3
5 3 1 3 1

输出 #1

3
4
20

输入输出样例 #2

输入 #2

5
100 1 100
100 1 101
20 2 12 8
123 4 80 20 21 3
999 5 101 234 499 66 99

输出 #2

1
1
125970
895031741
307187590

说明/提示

样例解释 1

对于第 111 个班级,学号为 0,1,20,1,20,1,2 的同学可以依次分别获得奖品 0,1,10,1,10,1,1,也可以依次分别获得奖品 1,0,11,0,11,0,1,也可以依次分别获得奖品 1,1,01,1,01,1,0 ,因此共有 333 种方案。

对于第 222 个班级,学号为 0,1,20,1,20,1,2 的同学可以依次分别获得奖品 0,1,10,1,10,1,1 ,也可以依次分别获得奖品 1,0,11,0,11,0,1,也可以依次分别获得奖品 1,1,01,1,01,1,0,也可以依次分别获得奖品 1,1,11,1,11,1,1,因此共有 444 种方案。

对于第 333 个班级,可以把编号为 000 的奖品分配给 555 名同学中的任意一名,共有 555 种方案;再把编号为 222 的奖品分配给剩余 444 名同学中的任意一名,共有444 种方案;最后给剩余 333 名同学自然获得 111 号奖品。因此,方案数为 5×4=205 \times 4 = 205×4=20

数据范围

对于 30%30\%30% 的测试点,保证 N≤10N \le 10N10

对于另外 30%30\%30% 的测试点,保证 M=2M=2M=2

对于所有测试点,保证 N≤1000N \le 1000N1000;保证 T≤1000T \le 1000T1000 ;保证 M≤1001M \le 1001M1001

solution

如果 m 种奖品一共有 n 件,则是一个分组问题,即
s=Ann∑i=1mAaiais=\frac{A_n^n}{\sum_{i=1}^mA_{a_i}^{a_i}}s=i=1mAaiaiAnn
如果 m 种奖品一共有 n + 1 件,假设另有一个小朋友 X 和他们一起分奖品,则和上面一样
s=An+1n+1∑i=1mAaiais=\frac{A_{n+1}^{n+1}}{\sum_{i=1}^mA_{a_i}^{a_i}}s=i=1mAaiaiAn+1n+1,但是用到了除法,对于模运算来说,需要求乘法逆元。当然可以规避则个问题,即用组合数表示即可。

代码

#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "set"
#include "queue"
#include "stack"
#include "algorithm"
#include "bitset"
#include "cstring"using namespace std;long long f[1002], g[1002], p = 1e9 + 7;int k, n, m, x;void init(int N) {f[1] = 1;for (int i = 2; i <= N; i++)f[i] = f[i - 1] * i % p;long long a = p - 2, t = f[N];g[N] = 1;while (a) {if (a & 1) {g[N] = g[N] * t % p;}t = t * t % p;a >>= 1;}for (int i = N - 1; i >= 1; i--)g[i] = g[i + 1] * (i + 1) % p;
}int main() {cin >> k;init(1001);while (k--) {cin >> n >> m;long long ans = 1, sum = 0;for (int i = 0; i < m; i++) {cin >> x;sum += x;ans = ans * g[x] % p;}ans = ans * f[sum] % p;cout << ans << endl;}
}

结果

在这里插入图片描述

http://www.dtcms.com/a/286228.html

相关文章:

  • 基于SpringBoot 投票系统 【源码+LW+PPT+部署】
  • Gemini Function Calling 和 Qwen3 Embedding和ReRanker模型
  • 40.限流规则
  • 用线性代数推导码分多址(CDMA)
  • 第16章 基于AB实验的增长实践——验证想法:AB实验实践
  • 【Python】一些PEP提案(三):with 语句、yield from、虚拟环境
  • 智象科技赋能金融、证券行业 IT 运维
  • Fluent许可有效期查询
  • 堆的实现,堆排序,咕咕咕
  • 几款开源的安全监控与防御工具分享
  • C++---cout、cerr、clog
  • 深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存
  • RV126平台NFS网络启动终极复盘报告
  • 深入解析 vLLM 分布式推理与部署策略
  • ChatBot 还能记住我是谁?深度解析对话系统中的记忆机制
  • 一文通晓25G多模光模块:SFP-25G-SR和SFP-25G-ESR的区别
  • 机器学习基础:线性回归算法详解(原理+代码+实战)
  • 视频讲解:XGBoost梯度提升树原理及用Python对房价等数据集多案例应用分析
  • 网络(TCP)
  • 百炼MCP与IoT实战(三):手搓自定义MCP Server与阿里云FC配置
  • CMU-15445(2024fall)——PROJECT#0
  • iOS 文件深度调试实战 查看用户文件 App 沙盒 系统文件与日志全指南
  • 【橘子分布式】gRPC(编程篇-上)
  • vue2 面试题及详细答案150道(91 - 100)
  • 人工智能概念之九:深度学习概述
  • kafka 单机部署指南(KRaft 版本)
  • 基于MATLAB的GA遗传算法优化BP神经网络的数据分类预测方法应用
  • 在ComfyUI中CLIP Text Encode (Prompt)和CLIPTextEncodeFlux的区别
  • docker gitlab 备份 恢复 版本升级(16.1.1到18.2.0)
  • SpringAI核心特性与Prompt工程