【BZOJ2142】礼物(扩展lucas定理,中国剩余定理合并方程)
题意:有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定理,中国剩余定理合并方程)的更多相关文章
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- BZOJ - 2142 礼物 (扩展Lucas定理)
扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...
- [BZOJ2142]礼物(扩展Lucas)
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2286 Solved: 1009[Submit][Status][Discuss] ...
- bzoj2142 礼物——扩展卢卡斯定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 前几天学了扩展卢卡斯定理,今天来磕模板! 这道题式子挺好推的(连我都自己推出来了) , ...
- BZOJ2142 礼物 扩展lucas 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...
- 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 ...
- Lucas定理和扩展Lucas定理
1.Lucas定理 首先给出式子:\(C_n^m\%p = C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor} * C_{n\%p}^{ ...
- 【learning】 扩展lucas定理
首先说下啥是lucas定理: $\binom n m \equiv \binom {n\%P} {m\%P} \times \binom{n/P}{m/P} \pmod P$ 借助这个定理,求$\bi ...
- Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理
http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...
- [笔记] 扩展Lucas定理
[笔记] 扩展\(Lucas\)定理 \(Lucas\)定理:\(\binom{n}{m} \equiv \binom{n/P}{m/P} \binom{n \% P}{m \% P}\pmod{P} ...
随机推荐
- 会jQuery,该如何用AngularJS编程思想?
我可以熟练使用jQuery进行客户端应用的开发,但是现在我希望开始使用Angular.js.哪位能描述一下这个过程中必要的模式变化吗?希望您的答案能够围绕下面这些具体的问题: 1. 我如何对客户端we ...
- android开发学习——This support library should not use a different version
http://blog.csdn.net/mvpstevenlin/article/details/55209966 完美解决系列
- [Luogu1345][USACO5.4]Telecowmunication 最大流
题目链接:https://www.luogu.org/problem/show?pid=1345 求最小割点集的大小,直接拆点转化成最小割边.把一个点拆成出点入点,入点向出点连一条容量为1的边,其他的 ...
- 前端css3样式前缀自动补全工具--autoprefixer
最近在学习一份来自git的动画框架源码,看懂70%的核心代码后,打算自己动手实践一版,然鹅,所有框架搭起来以后,在动画这块却出了问题: 想设计一个slideInLeft的动画,必然想到了要从偏移-10 ...
- 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路
1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文 ...
- Axure 9 面板折叠显示隐藏
1 首先放置一个面板1作为点击事件: 2 另外一个面板2或者其他组建,将其设置为动态面板,然后隐藏 3 给面板1添加如下事件,即可: 4 我们点击面板1,可以实现展开隐藏面板2的动态效果
- java解决动态的锁顺序死锁的方案
直接上代码 public class Test3 { public static Object fromAccount = new String("1"); public stat ...
- Maven常用仓库地址以及手动添加jar包到仓库
http://www.blogjava.net/fancydeepin 共有的仓库 http://repository.sonatype.org/content/groups/public/http: ...
- 修改python注册表
转自:http://blog.csdn.net/u014680513/article/details/51005650 # script to register Python 2.0 or later ...
- 神经机器翻译(NMT)开源工具
博客地址:http://blog.csdn.net/wangxinginnlp/article/details/52944432 工具名称:T2T: Tensor2Tensor Transformer ...