[国家集训队]礼物

题目背景

一年一度的圣诞节快要来到了。每年的圣诞节小 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=1t​pici​​,

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 [国家集训队]【一本通提高组合数学】礼物的更多相关文章

  1. 洛谷 P2183 [国家集训队]礼物

    题目描述 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物 ...

  2. luogu P2183 [国家集训队]礼物

    LINK:礼物 n个物品 m个人 每个人要分得wi 个物品 每个物品互异 分给每个人的物品不分顺序 求方案数. \(n,p\leq 1e9 m\leq 5\) 方案数 那显然是 第一个人拿了w1件物品 ...

  3. 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 ...

  4. P2532 [AHOI2012]【一本通提高组合数学】树屋阶梯

    [AHOI2012]树屋阶梯 题目描述 输入格式 一个正整数N( 1 ≤ N ≤ 500 1\le N \le 500 1≤N≤500),表示阶梯的高度. 输出格式 一个正整数,表示搭建方法的个数.( ...

  5. [HNOI2009]【一本通提高组合数学】有趣的数列

    [HNOI2009]有趣的数列 题目描述 我们称一个长度为 2 n 2n 2n 的数列是有趣的,当且仅当该数列满足以下三个条件: 它是从 1 ∼ 2 n 1 \sim 2n 1∼2n 共 2 n 2n ...

  6. 【一本通提高组合数学】 计算系数(NOIP2011提高组)

    题面 思路 根据二项式定理, 那么 算  需要用快速幂. 可以根据组合式的递推公式算组合数.我是这么写的. 或者是利用组合数的定义式,但是因为有取余, 所以要用逆元. 其中  为逆元, 这个可以直接用 ...

  7. NOI 国家集训队论文集

    鉴于大家都在找这些神牛的论文.我就转载了这篇论文合集 国家集训队论文分类 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化 ...

  8. 【LG2183】[国家集训队]礼物

    [LG2183][国家集训队]礼物 题面 洛谷 题解 插曲:不知道为什么,一看到这个题目,我就想到了这个人... 如果不是有\(exLucas\),这题就是\(sb\)题... 首先,若\(\sum_ ...

  9. 【题解】国家集训队礼物(Lucas定理)

    [国家集训队]礼物(扩展Lucas定理) 传送门可以直接戳标题 172.40.23.20 24 .1 答案就是一个式子: \[ {n\choose \Sigma_{i=1}^m w}\times\pr ...

随机推荐

  1. 深度长文:深入理解Ceph存储架构

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 本文是一篇Ceph存储架构技术文章,内容深入到每个存储特 ...

  2. OpenStack平台调度策略优化

    OpenStack平台报错分析 在OpenStack平台经历大并发的时候,比如同一个平台,大量的用户同时创建云主机(单个用户创建大量云主机不会触发此种现象),会达到云平台的性能瓶颈,导致创建云主机报错 ...

  3. 数据库、MySQL下载与安装、基本SQL语句

    数据演变史 # 1.单独的文本文件 没有固定的存放位置 没有固定的数据格式 '''程序彼此无法兼容 没有统一的标准''' # 2.软件开发目录规范 按照文件功能的不同规定了相应的位置 '''文件查找变 ...

  4. wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法

    由于users用户组无权重写access数据库,需要设置users组用户能读写access数据库.

  5. 56. Merge Intervals - LeetCode

    Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...

  6. 好客租房21-react组件的两种创建方式(函数组件)

    1使用函数创建组件 函数组件:使用js的函数或者箭头函数创建的组件 约定1:函数组件名称必须以 开头 约定2:函数组件必须有返回值 表示该组件的结构 如果返回值为null 表示不渲染任何内容 2.1使 ...

  7. 数据库与MySQL的下载使用

    目录 数据存储演变史 数据库应用发展史 数据库本质 数据库分类 关系型数据库 非关系型数据库 SQL与NoSQL MySQL简介 版本问题 下载使用 目录结构 基本使用 简单使用 系统服务 修改密码 ...

  8. redis高可用、redis集群、redis缓存优化

    今日内容概要 redis高可用 redis集群 redis缓存优化 内容详细 1.redis高可用 # 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个sl ...

  9. docker 快速上手

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口 安装 docker 设置仓库 $ sudo yum install -y yum-utils $ sudo yum-conf ...

  10. 内网 Ubuntu 20.04 搭建 docusaurus 项目(或前端项目)的环境(mobaxterm、tigervnc、nfs、node)

    内网 Ubuntu 20.04 搭建 docusaurus 项目(或前端项目)的环境 背景 内网开发机是 win7,只能安装 node 14 以下,而 spug 的文档项目采用的是 Facebook ...