题意:有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. Kali linux 2016.2(Rolling)里的应用更新和配置额外安全工具

    写在前面的话 你去打人家 ,你不伪装一下,化化妆 ,穿上盔甲,难道你傻逼一样的    拿着棍子就去打人家,人家 一眼不认出你是谁了.做坏事要伪装好自己 ,要把自己藏起来 ,让别人找不到你,你以为网络公 ...

  2. xUtils 简介

    ## xUtils简介* xUtils 包含了很多实用的android工具.* xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(1 ...

  3. 2556. [NOIP2016]玩具谜题

    [题目描述] 小南有一套可爱的玩具小人,它们各有不同的职业.有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝国内,有的面朝圈外.如下图: 这时singer告诉小南 ...

  4. APK瘦身-是时候给App进行减负了

    前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装.前一段时间我司某一App进行APK的瘦身,最终也达到了减小10M的目标,现做一个简单的总结记录. ...

  5. Apache Tomcat 之路(一 基本概念)

    关于apache tomcat 基本概念(https://tomcat.apache.org/tomcat-7.0-doc/index.html) 1.tomcat 是servlet/jsp 容器,对 ...

  6. PHP常量和数据类型考察点

    PHP 常量 常量是单个值的标识符(名称).在脚本中无法改变该值. 有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号). 注释:与变量不同,常量贯穿整个脚本是自动全局的. PHP常量的两种定 ...

  7. C# 处理年月日提取时间

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. jsonP 现在360浏览器竟然阻止本机 jquery load一些html js什么的

    别的浏览器正常可以jquery.load本机文件,但是360浏览器不行了,缺德啊!! jsonP代码 index3.html <!DOCTYPE HTML PUBLIC "-//W3C ...

  9. CAD设置超链接(网页版)

    超链接(Hyperlink)可以看做是一个“热点”,它可以从当前Web页定义的位置跳转到其他位置. 设置对象动态提示事件回调函数. //设置对象动态提示事件回调函数 function DoInputP ...

  10. CSS 实现毛玻璃效果

    Part.1 HTML结构 <!-- 最外层盒子 --> <div class="box"> <!-- 添加毛玻璃效果盒子 --> <di ...