题目

一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E

心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多。小E从商店中购买了n件礼物,打算送给m个人

,其中送给第i个人礼物数量为wi。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某

个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模P后的结果。

输入格式

输入的第一行包含一个正整数P,表示模;

第二行包含两个整整数n和m,分别表示小E从商店购买的礼物数和接受礼物的人数;

以下m行每行仅包含一个正整数wi,表示小E要送给第i个人的礼物数量。

输出格式

若不存在可行方案,则输出“Impossible”,否则输出一个整数,表示模P后的方案数。

输入样例

100

4 2

1

2

输出样例

12

提示

【样例说明】

下面是对样例1的说明。

以“/”分割,“/”前后分别表示送给第一个人和第二个人的礼物编号。12种方案详情如下:

1/23 1/24 1/34

2/13 2/14 2/34

3/12 3/14 3/24

4/12 4/13 4/23

【数据规模和约定】

设P=p1^c1 * p2^c2 * p3^c3 * … *pt ^ ct,pi为质数。

对于100%的数据,1≤n≤109,1≤m≤5,1≤pici≤105。

题解

式子很简单,记\(sum[i]\)为w[i]前缀和:

\[ans = {n \choose sum[m]} \prod\limits {sum[m] - sum[i - 1] \choose w[i]}
\]

重点在于计算\(C_{n}^{m} \mod P\),其中\(n,m \le 10^9\)且\(P = p_1^{k_1}*p_2^{k_2}*p_3^{k_3}.....\),其中每一个\(p_i^{k_i} \le 10^5\)

扩展Lucas##

对于质数\(P \le 10^5\),我们可以用Lucas定理计算出

\[C_{n}^{m} = \prod\limits_{i = 1} C_{\lfloor \frac{n}{P^{i - 1}} \rfloor \mod P^i}^{\lfloor \frac{m}{P^{i - 1}} \rfloor \mod P^i}
\]

但对于合数\(P\),Lucas定理就不再适用了

于是我们使用中国剩余定理

\[\left\{
\begin{array}{c}
x\equiv c_1\pmod {m_1}\\
x\equiv c_2\pmod {m_2} \\
x\equiv c_3\pmod {m_3}\\
...\\
x\equiv c_k\pmod {m_k}
\end{array}
\right.\]

显然\(x\)就是答案,用中国剩余定理合并出\(x\)

我们只需要快速计算\(C_{n}^{m} \mod p_i^{k_i}\)

我们只需要快速计算\(n! \mod p_i^{k_i}\)

因为\((a + P) \equiv a \pmod P\)

\[n! = \prod\limits_{i = 1}^{n} i
\]

所以我们对\(n\)个数按\(P\)进行分组并提取出其中\(p_i\)的倍数,假使有\(t\)个

可以得出

\[n! = p_i^{t} * (\prod\limits_{x = 1}^{p_i^{k_i}} x [x \mod p_i \ne 0])^{\frac{n}{p_i^{k_i}}} * (\lfloor \frac{n}{p_i} \rfloor)!
\]

左边是\(O(p_i^{k_i})\)的,右边递归\(\lfloor \frac{n}{p_i} \rfloor\)

我们先提取出\(n,m,n - m\)的\(p_i\),使其结果必定与\(p_i\)

其中\(n!\)中\(p\)的个数为\(x=\lfloor{n\over p}\rfloor+\lfloor{n\over p^2}\rfloor+\lfloor{n\over p^3}\rfloor+...\)

最后结合逆元计算出\(\frac{n!}{m!(n-m)!}\)再乘上\(p_i^{\sum t}\)就行了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 100005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
LL sum;
int md,n,m,a[10];
int p[maxn],pk[maxn],pi,Ans[maxn];
void Sp(){
int x = md;
for (int i = 2; i * i <= x; i++){
if (x % i == 0){
p[++pi] = i; pk[pi] = 1;
while (x % i == 0) x /= i,pk[pi] *= i;
}
}
if (x - 1) ++pi,p[pi] = pk[pi] = x;
}
int qpow(int a,int b,int md){
int ans = 1;
for (; b; b >>= 1,a = 1ll * a * a % md)
if (b & 1) ans = 1ll * ans * a % md;
return ans;
}
void exgcd(int a,int b,int& d,int& x,int& y){
if (!b) {d = a; x = 1; y = 0;}
else exgcd(b,a % b,d,y,x),y -= (a / b) * x;
}
int inv(int a,int P){
int d,x,y; exgcd(a,P,d,x,y);
return (x % P + P) % P;
}
int Fac(int n,int P,int Pi){
if (!n) return 1;
int ans = 1;
if (n / P){
for (int i = 2; i < P; i++)
if (i % Pi) ans = 1ll * ans * i % P;
ans = qpow(ans,n / P,P);
}
int E = n % P;
for (int i = 2; i <= E; i++)
if (i % Pi) ans = 1ll * ans * i % P;
return 1ll * ans * Fac(n / Pi,P,Pi) % P;
}
int C(int n,int m,int P,int pi){
if (m > n) return 0;
int a = Fac(n,P,pi),b = Fac(m,P,pi),c = Fac(n - m,P,pi),k = 0,ans;
for (int i = n; i; i /= pi) k += i / pi;
for (int i = m; i; i /= pi) k -= i / pi;
for (int i = n - m; i; i /= pi) k -= i / pi;
ans = 1ll * a * inv(b,P) % P * inv(c,P) % P * qpow(pi,k,P) % P;
return 1ll * ans * (md / P) % md * inv(md / P,P) % md;
}
int exlucas(int n,int m){
int ans = 0;
for (int i = 1; i <= pi; i++){
ans = (ans + C(n,m,pk[i],p[i])) % md;
}
return ans;
}
int main(){
md = read(); n = read(); m = read();
for (int i = 1; i <= m; i++){
sum += (a[i] = read());
if (sum > n) {puts("Impossible"); return 0;}
}
Sp();
int ans = exlucas(n,sum);
for (int i = 1; i <= m; i++)
ans = 1ll * ans * exlucas(sum,a[i]) % md,sum -= a[i];
printf("%d\n",ans);
return 0;
}

BZOJ2142 礼物 【扩展Lucas】的更多相关文章

  1. [BZOJ2142]礼物(扩展Lucas)

    2142: 礼物 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2286  Solved: 1009[Submit][Status][Discuss] ...

  2. [bzoj2142]礼物(扩展lucas定理+中国剩余定理)

    题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod  = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...

  3. BZOJ2142 礼物 扩展lucas 快速幂 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...

  4. BZOJ.2142.礼物(扩展Lucas)

    题目链接 答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p) 使用扩展Lucas求解. 一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解 ...

  5. BZOJ - 2142 礼物 (扩展Lucas定理)

    扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...

  6. bzoj 2142 礼物——扩展lucas模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas. 学习材料 ...

  7. BZOJ2142礼物——扩展卢卡斯

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

  8. bzoj2142 礼物——扩展卢卡斯定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 前几天学了扩展卢卡斯定理,今天来磕模板! 这道题式子挺好推的(连我都自己推出来了) , ...

  9. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

随机推荐

  1. 2018Java年底总结

    一年又过去了,这是我的第二年的JAVA开发,总感觉有很多想说的,可惜语言组织能力着实一般,以下列举一些今年的总结. 1.首先告诫一下新入行或者新入职经验不多的小伙伴,写sql的时候根据业务能单表就单表 ...

  2. NAT概念解释(不完全版,但不会搞错...)

    NAT在计算器网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading)是一种IP数据包在通过路由器或防 ...

  3. mac指令备忘

    在这里简单记录下最近使用的快捷键,备忘,随时更新. 简单指令记录 mkdir 创建路径 pwd 输出当前路径 ls 查看目录 cd touch 创建文件 tree 输出目录树 mv 源文件 目标文件或 ...

  4. 15 Puzzle (4乘4谜题) IDA*(DFS策略与曼哈顿距离启发) 的C语言实现

    大家好!这是我的第一篇博客,由于之前没有撰写博客的经验,并且也是初入计算机和人工智能领域,可能有些表述或者理解不当,还请大家多多指教. 一.撰写目的 由于这个学期在上算法与数据结构课程的时候,其中一个 ...

  5. maven 添加spring/springmvc依赖项

    <spring.version>4.3.18.RELEASE</spring.version> <dependencies> <!--添加spring.spr ...

  6. Thunder——Final发布

    视频: https://www.bilibili.com/video/av17008792/   视频播放截图及简要文字介绍: http://www.cnblogs.com/lick468/p/799 ...

  7. python service 服务没有及时响应启动或控制请求

    1053错误 代码运行没有问题后,安装服务,然而start 的时候出现错误 1053:服务没有及时响应启动或控制请求(Error 1053: The service did not respond t ...

  8. Servlet以流的形式返回图片

    代码: import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import ...

  9. windows redis 后台运行

    1. 进入 DOS窗口2. 在进入Redis的安装目录3. 输入:redis-server --service-install redis.windows.conf --loglevel verbos ...

  10. What is ASP.NET SignalR

    什么是ASP.NET SignalR ASP.NET SignalR是ASP.NET开发人员的新库,它使得为应用程序添加实时Web功能变得非常简单. 什么是“实时网络”功能?它能够让您的服务器端代码实 ...