P2183 [国家集训队]【一本通提高组合数学】礼物
[国家集训队]礼物
题目背景
一年一度的圣诞节快要来到了。每年的圣诞节小 E 都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小 E 心目中的重要性不同,在小 E 心中分量越重的人,收到的礼物会越多。
题目描述
小 E 从商店中购买了
n
n
n 件礼物,打算送给
m
m
m 个人,其中送给第
i
i
i 个人礼物数量为
w
i
w_i
wi。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模
P
P
P 后的结果。
输入格式
输入的第一行包含一个整数
P
P
P,表示模数。
第二行包含两个整数
n
n
n 和
m
m
m,分别表示小 E 从商店购买的礼物数和接受礼物的人数。
第
3
3
3 到第
(
m
+
2
)
(m + 2)
(m+2) 行,每行一个整数,第
(
i
+
2
)
(i + 2)
(i+2) 行的整数
w
i
w_i
wi 表示送给第
i
i
i 个人的礼物数量。
输出格式
若不存在可行方案,则输出 Impossible
,否则输出一个整数,表示模
P
P
P 后的方案数。
输入输出样例
样例输入1
100
4 2
1
2
样例输出1
12
样例输入2
100
2 2
1
2
样例输出2
Impossible
说明/提示
样例 1 解释
以 /
分割,/
前后分别表示送给第一个人和第二个人的礼物编号。
12
12
12 种方案详情如下:
1/2 3 1/2 4 1/3 4
2/1 3 2/1 4 2/3 4
3/1 2 3/1 4 3/2 4
4/1 2 4/1 3 4/2 3
数据规模与约定
设
P
=
∏
i
=
1
t
p
i
c
i
P= \prod_{i=1}^t p_i^{c_i}
P=∏i=1tpici,
p
i
p_i
pi 为质数。
对于
15
%
15\%
15% 的数据,
n
≤
15
n\leq 15
n≤15,
m
≤
5
m\leq 5
m≤5,
p
i
c
i
≤
1
0
5
p_i^{c_i}\leq 10^5
pici≤105。
在剩下的
85
%
85\%
85% 数据中,约有
60
%
60\%
60% 的数据满足
t
≤
2
t\leq 2
t≤2,
c
i
=
1
c_i=1
ci=1,
p
i
≤
1
0
5
p_i\leq 10^5
pi≤105,约有
30
%
30\%
30% 的数据满足
p
i
≤
200
p_i\leq 200
pi≤200。
对于
100
%
100\%
100% 的数据,
1
≤
n
≤
1
0
9
1\leq n\leq 10^9
1≤n≤109,
1
≤
m
≤
5
1\leq m\leq 5
1≤m≤5,
1
≤
p
i
c
i
≤
1
0
5
1\leq p_i^{c_i}\leq 10^5
1≤pici≤105,
1
≤
w
i
≤
P
≤
1
0
9
1\leq w_i \leq P\leq 10^9
1≤wi≤P≤109。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int w[10005];
int p, n, m, s, k = 1;
void exgcd(int a, int b, int &x, int &y)
{
if (b)
{
exgcd(b, a % b, y, x);
y -= a / b * x;
}
else
x = 1, y = 0;
}
int inv(int a, int p)
{
int x, y;
exgcd(a, p, x, y);
return (x + p) % p;
}
int qmi(int a, int b, int p)
{
int res = 1;
while (b)
{
if (b & 1)
res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
int f(int a, int p, int k)
{
if (!a)
return 1;
int i, u = 1, v = 1;
for (i = 1; i < k; ++i)
if (i % p)
u = i * u % k;
for (i = a / k * k; i <= a; ++i)
if (i % p)
v = i % k * v % k;
return f(a / p, p, k) * qmi(u, a / k, k) % k * v % k;
}
int g(int a, int p)
{
if (a < p)
return 0;
return g(a / p, p) + a / p;
}
int h(int a, int b, int p, int k)
{
return f(a, p, k) * inv(f(b, p, k), k) % k * inv(f(a - b, p, k), k) % k * qmi(p, g(a, p) - g(b, p) - g(a - b, p), k) % k;
}
int exlucas(int a, int b, int p)
{
int i, j, k, l, s = 0;
for (i = 2, j = p; i * i <= j; ++i)
{
if (j % i)
continue;
for (k = i, j /= i; !(j % i); k *= i)
j /= i;
l = p / k;
s = (s + l * h(a, b, i, k) % p * inv(l, k)) % p;
}
if (j > 1)
{
l = p / j;
s = (s + l * h(a, b, j, j) % p * inv(l, j)) % p;
}
return s;
}
signed main()
{
cin >> p >> n >> m;
for (int i = 0; i < m; ++i)
{
cin >> w[i];
s += w[i];
}
if (s > n)
{
puts("Impossible");
return 0;
}
for (int i = 0; i < m; ++i)
{
k = k * exlucas(n, w[i], p) % p;
n -= w[i];
}
cout << k;
return 0;
}
广告
绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/
绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/
(现在使用,人人均可获得300元大奖)
P2183 [国家集训队]【一本通提高组合数学】礼物的更多相关文章
- 洛谷 P2183 [国家集训队]礼物
题目描述 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物 ...
- luogu P2183 [国家集训队]礼物
LINK:礼物 n个物品 m个人 每个人要分得wi 个物品 每个物品互异 分给每个人的物品不分顺序 求方案数. \(n,p\leq 1e9 m\leq 5\) 方案数 那显然是 第一个人拿了w1件物品 ...
- Luogu P2183 [国家集训队]礼物 扩展卢卡斯+组合数
好吧学长说是板子...学了之后才发现就是板子qwq 题意:求$ C_n^{w_1}*C_{n-w_1}^{w_2}*C_{n-w_1-w_2}^{w_3}*...\space mod \space P ...
- P2532 [AHOI2012]【一本通提高组合数学】树屋阶梯
[AHOI2012]树屋阶梯 题目描述 输入格式 一个正整数N( 1 ≤ N ≤ 500 1\le N \le 500 1≤N≤500),表示阶梯的高度. 输出格式 一个正整数,表示搭建方法的个数.( ...
- [HNOI2009]【一本通提高组合数学】有趣的数列
[HNOI2009]有趣的数列 题目描述 我们称一个长度为 2 n 2n 2n 的数列是有趣的,当且仅当该数列满足以下三个条件: 它是从 1 ∼ 2 n 1 \sim 2n 1∼2n 共 2 n 2n ...
- 【一本通提高组合数学】 计算系数(NOIP2011提高组)
题面 思路 根据二项式定理, 那么 算 需要用快速幂. 可以根据组合式的递推公式算组合数.我是这么写的. 或者是利用组合数的定义式,但是因为有取余, 所以要用逆元. 其中 为逆元, 这个可以直接用 ...
- NOI 国家集训队论文集
鉴于大家都在找这些神牛的论文.我就转载了这篇论文合集 国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化 ...
- 【LG2183】[国家集训队]礼物
[LG2183][国家集训队]礼物 题面 洛谷 题解 插曲:不知道为什么,一看到这个题目,我就想到了这个人... 如果不是有\(exLucas\),这题就是\(sb\)题... 首先,若\(\sum_ ...
- 【题解】国家集训队礼物(Lucas定理)
[国家集训队]礼物(扩展Lucas定理) 传送门可以直接戳标题 172.40.23.20 24 .1 答案就是一个式子: \[ {n\choose \Sigma_{i=1}^m w}\times\pr ...
随机推荐
- 团队Arpha5
队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...
- 基于casbin的RBAC权限实践
五一假期疫情封在家也没事做,就想来优化一下一个前端容器小项目 之前的TODOlist里面有一项是权限这块时隔2年了还一直没有动手 迟迟没搞主要还是我太懒了,哈哈 其实我一直想要找一个轻量级的权限通用方 ...
- dubbo发送过程编码失败,会唤醒发送线程吗?
dubbo发送过程编码失败,会唤醒发送(客户端业务)线程吗?如何实现的? 在上篇文章 dubbo坑- No provider available for the service xxx 中,如果dub ...
- 调试F9/F10/F11/F8
这篇随笔记录来自于实现活动促销页弹幕过程学习: // 页面加载完初始化方法$(function () { GetCustList(); createBarrage(); }) // 某功能的初始化方法 ...
- brew常用命令
Homebrew 常用命令 brew -help # 查看帮助命令 brew config # 查看配置信息 brew list # 查看已安装软件包列表 brew cleanup # 清理所有包的旧 ...
- 使用ROOT用户运行Jenkins
!本教程仅适用于以YUM.APT等包管理器安装的Jenkins. 使用ROOT用户运行Jenkins,以保证Jenkins以最高权限执行任务. 注:会存在安全风险! 1.找到Jenkins启动脚本 通 ...
- Python <算法思想集结>之初窥基础算法
1. 前言 数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机. 什么是数据结构? 指数据在计算机中的存储方式,数据的存储方式会影响到获取数据的便利性. 现实生活中 ...
- SQLServer2008中的Merge
SqlServer2008 + 中的 Merge Merge: 合并 融合 SqlServer2008 中的Merge 用于匹配两种表中的数据,根据源表和目标表中的数据的比较结果对目标表进行对 ...
- 测试open
// 此处,返回的 undefined 是 JS 中的一个值 return undefined } // 这种写法是明确指定函数返回值类型为 void,与上面不指定返回值类型相同 const add ...
- Dubbo3 源码系列 -- 环境准备
Dubbo3 源码系列 -- 环境准备 前言 工作中一直使用Dubbo项目,借着这次机会通过源码的方式来学习下Dubbo的源码内容.目前市面上很多都是的Dubbo2系列的教程:就连目前的Dubbo的官 ...