题意:有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. Spring注解驱动开发之扩展原理

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  2. time模块、datetime模块讲解

    time模块清楚三种格式的时间相互转换 import time# 时间分为三种格式#1.时间戳start= time.time()time.sleep(3)stop= time.time()print ...

  3. CCF|游戏|Java

    import java.util.Scanner; public class tyt { public static void main(String[] args) { Scanner in = n ...

  4. 机器学习-随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )

    梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...

  5. vue2.0排序应该注意的问题

    在computed里新声明了一个对象sortItems,如果不重新声明会污染原来的数据源,这是Vue不允许的,所以你要重新声明一个对象. 如果不重新声明报错: <!DOCTYPE html> ...

  6. uoj #15. 【NOIP2014】生活大爆炸版石头剪刀布

    石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪 ...

  7. H3C AR28-31路由器组网实验

    接线图 可以发现PC1和PC2不在一个网段上,如果不靠路由器就不可能ping,所以要用路由器组网 接线步骤 串行线连接路由器1与路由器2 以太网线连路由器以太网口 与 交换机接口 计算机网线连交换机口 ...

  8. 恩智浦Freescale Cortex-A9 迅为IMX6开发板平台初体验

    iTOP-i.MX6 开发板预装 Android4.4 系统,采用 9.7 寸(或者 7 寸或者 4.3 寸)IPS 屏 幕,至少 5 点以上触控,操作流畅,无论是高清视频.游戏等都会有上佳的表现,实 ...

  9. leetcode_919. Complete Binary Tree Inserter

    https://leetcode.com/problems/complete-binary-tree-inserter/ 设计一个CBTInserter,使用给定完全二叉树初始化.三个功能; CBTI ...

  10. spring-shiro 配置

    配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www ...