[国家集训队]礼物

题目背景

一年一度的圣诞节快要来到了。每年的圣诞节小 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. 团队Arpha5

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...

  2. 基于casbin的RBAC权限实践

    五一假期疫情封在家也没事做,就想来优化一下一个前端容器小项目 之前的TODOlist里面有一项是权限这块时隔2年了还一直没有动手 迟迟没搞主要还是我太懒了,哈哈 其实我一直想要找一个轻量级的权限通用方 ...

  3. dubbo发送过程编码失败,会唤醒发送线程吗?

    dubbo发送过程编码失败,会唤醒发送(客户端业务)线程吗?如何实现的? 在上篇文章 dubbo坑- No provider available for the service xxx 中,如果dub ...

  4. 调试F9/F10/F11/F8

    这篇随笔记录来自于实现活动促销页弹幕过程学习: // 页面加载完初始化方法$(function () { GetCustList(); createBarrage(); }) // 某功能的初始化方法 ...

  5. brew常用命令

    Homebrew 常用命令 brew -help # 查看帮助命令 brew config # 查看配置信息 brew list # 查看已安装软件包列表 brew cleanup # 清理所有包的旧 ...

  6. 使用ROOT用户运行Jenkins

    !本教程仅适用于以YUM.APT等包管理器安装的Jenkins. 使用ROOT用户运行Jenkins,以保证Jenkins以最高权限执行任务. 注:会存在安全风险! 1.找到Jenkins启动脚本 通 ...

  7. Python <算法思想集结>之初窥基础算法

    1. 前言 数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机. 什么是数据结构? 指数据在计算机中的存储方式,数据的存储方式会影响到获取数据的便利性. 现实生活中 ...

  8. SQLServer2008中的Merge

    SqlServer2008 +  中的 Merge Merge:  合并   融合 SqlServer2008 中的Merge 用于匹配两种表中的数据,根据源表和目标表中的数据的比较结果对目标表进行对 ...

  9. 测试open

    // 此处,返回的 undefined 是 JS 中的一个值 return undefined } // 这种写法是明确指定函数返回值类型为 void,与上面不指定返回值类型相同 const add ...

  10. Dubbo3 源码系列 -- 环境准备

    Dubbo3 源码系列 -- 环境准备 前言 工作中一直使用Dubbo项目,借着这次机会通过源码的方式来学习下Dubbo的源码内容.目前市面上很多都是的Dubbo2系列的教程:就连目前的Dubbo的官 ...