题意:有n件礼物,m个人,每个人分别需要w[i]件礼物,求分礼物的不同方案数 mod P

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

1≤n≤10^9,1≤m≤5,1≤pi^ci≤10^5。

P不一定为质数

思路:经推导答案即为n!/(w[i]!),i=1..n

考虑P不是质数

将P分解为提示中所说的形式,可以发现所有pt^ct都是互质的,所以我们可以用下图的中国剩余定理合并

From http://blog.csdn.net/popoqqq/article/details/39891263

然后对于每个pi^ai,我们进行以下处理:

将分子和分母化为x*pi^y的形式

然后分母的x部分与pi互质,可以求逆元,分子分母的y部分直接相减即可

然后我们处理阶乘

以19为例,将19!化为x*pi^y的形式,其中pi=3,ai=2 则有

19!%9=(1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19) %9

=(1*2*4*5*7*8*10*11*13*14*16*17*19)*3^6*(1*2*3*4*5*6) %9

式子的左半部分是不为3的倍数的数,存在长度为p^a的循环节 求出一个循环节 快速幂处理 然后处理剩余部分

右半部分是6!%9 递归处理即可

用这样的思路就可以换解决C(n,m) mod p,p不为质数的情况了

 var a:array[..]of int64;
n,m,i:longint;
ans,s,mo:int64; function mult(x,y,p:int64):int64;
var tmp:int64;
begin
mult:=; tmp:=x;
while y> do
begin
if y and = then mult:=mult*tmp mod p;
tmp:=tmp*tmp mod p;
y:=y>>;
end;
end; procedure exgcd(a,b:int64;var d,x,y:int64);
begin
if b= then
begin
d:=a; x:=; y:=;
end
else
begin
exgcd(b,a mod b,d,y,x);
y:=y-(a div b)*x;
end;
end; function inv(a,n:int64):int64;
var d,x,y:int64;
begin
exgcd(a,n,d,x,y);
if d= then exit((x+n) mod n);
exit(-);
end; function fac(n,p,pr:int64):int64;
var i,re,r:int64;
begin
if n= then exit();
re:=; i:=;
while i<=pr do
begin
if i mod p> then re:=re*i mod pr;
inc(i);
end; re:=mult(re,n div pr,pr);
r:=n mod pr;
i:=;
while i<=r do
begin
if i mod p> then re:=re*i mod pr;
inc(i);
end; exit(re*fac(n div p,p,pr) mod pr);
end; function c(n,m,p,pr:int64):int64;
var x,y,z,t,tmp:int64;
begin
if n<m then exit();
x:=fac(n,p,pr);
y:=fac(m,p,pr);
z:=fac(n-m,p,pr);
c:=;
t:=n;
while t> do
begin
c:=c+t div p;
t:=t div p;
end;
t:=m;
while t> do
begin
c:=c-t div p;
t:=t div p;
end;
t:=n-m;
while t> do
begin
c:=c-t div p;
t:=t div p;
end;
tmp:=x*inv(y,pr) mod pr*inv(z,pr) mod pr*mult(p,c,pr) mod pr;
exit(tmp*(mo div pr) mod mo*inv(mo div pr,pr) mod mo);
end; function lucas(n,m:int64):int64;
var x,re,i,pr:int64;
begin
i:=; x:=mo; re:=;
while i<=x do
begin
if x mod i= then
begin
pr:=;
while x mod i= do
begin
x:=x div i; pr:=pr*i;
end;
re:=(re+c(n,m,i,pr)) mod mo;
end;
inc(i);
end;
exit(re);
end; begin
assign(input,'bzoj2142.in'); reset(input);
assign(output,'bzoj2142.out'); rewrite(output);
readln(mo);
readln(n,m);
for i:= to m do
begin
read(a[i]); s:=s+a[i];
end;
if s>n then
begin
writeln('Impossible');
close(input);
close(output);
exit;
end;
ans:=;
for i:= to m do
begin
ans:=ans*lucas(n,a[i]) mod mo;
n:=n-a[i];
end;
writeln(ans); close(input);
close(output);
end.

【BZOJ2142】礼物(扩展lucas定理,中国剩余定理合并方程)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)

    J. Ceizenpok’s formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  7. Lucas定理和扩展Lucas定理

    1.Lucas定理 首先给出式子:\(C_n^m\%p = C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor} * C_{n\%p}^{ ...

  8. 【learning】 扩展lucas定理

    首先说下啥是lucas定理: $\binom n m \equiv \binom {n\%P} {m\%P} \times \binom{n/P}{m/P} \pmod P$ 借助这个定理,求$\bi ...

  9. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理

    http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...

  10. [笔记] 扩展Lucas定理

    [笔记] 扩展\(Lucas\)定理 \(Lucas\)定理:\(\binom{n}{m} \equiv \binom{n/P}{m/P} \binom{n \% P}{m \% P}\pmod{P} ...

随机推荐

  1. 会jQuery,该如何用AngularJS编程思想?

    我可以熟练使用jQuery进行客户端应用的开发,但是现在我希望开始使用Angular.js.哪位能描述一下这个过程中必要的模式变化吗?希望您的答案能够围绕下面这些具体的问题: 1. 我如何对客户端we ...

  2. android开发学习——This support library should not use a different version

    http://blog.csdn.net/mvpstevenlin/article/details/55209966 完美解决系列

  3. [Luogu1345][USACO5.4]Telecowmunication 最大流

    题目链接:https://www.luogu.org/problem/show?pid=1345 求最小割点集的大小,直接拆点转化成最小割边.把一个点拆成出点入点,入点向出点连一条容量为1的边,其他的 ...

  4. 前端css3样式前缀自动补全工具--autoprefixer

    最近在学习一份来自git的动画框架源码,看懂70%的核心代码后,打算自己动手实践一版,然鹅,所有框架搭起来以后,在动画这块却出了问题: 想设计一个slideInLeft的动画,必然想到了要从偏移-10 ...

  5. 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路

    1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文 ...

  6. Axure 9 面板折叠显示隐藏

    1  首先放置一个面板1作为点击事件: 2  另外一个面板2或者其他组建,将其设置为动态面板,然后隐藏 3  给面板1添加如下事件,即可: 4  我们点击面板1,可以实现展开隐藏面板2的动态效果

  7. java解决动态的锁顺序死锁的方案

    直接上代码 public class Test3 { public static Object fromAccount = new String("1"); public stat ...

  8. Maven常用仓库地址以及手动添加jar包到仓库

    http://www.blogjava.net/fancydeepin 共有的仓库 http://repository.sonatype.org/content/groups/public/http: ...

  9. 修改python注册表

    转自:http://blog.csdn.net/u014680513/article/details/51005650 # script to register Python 2.0 or later ...

  10. 神经机器翻译(NMT)开源工具

    博客地址:http://blog.csdn.net/wangxinginnlp/article/details/52944432 工具名称:T2T: Tensor2Tensor Transformer ...