参考:http://blog.csdn.net/wzq_qwq/article/details/46709471

首先推组合数,设sum为每个人礼物数的和,那么答案为

\[( C_{n}^{sum}C_{sum}^{w[1]}c_{sum-w[1]}^{w[2]}...
\]

设w[0]=n-sum,然后化简成阶乘的形式:

\[\frac{n!}{w[0]!w[1]!...w[n]!}
\]

注意到这里p不是质数,所以把p拆成质数的方相乘的形式,最后用中国剩余定理合并即可

然后现在的问题是怎么快速求出阶乘

假设当前的质数的方为p=3那么1x2x3x4x5x6x7x8x9x10x11=1x2x4x5x7x8x10x11x 3x(1x2x3),注意到后面又是一个阶乘,但是范围更小,所以可以递归来做,然后前面乘的3被模消去了

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
long long P,n,m,w[10],p[N],cnt[N],mod[N],tot,sum,a[N];
struct qwe
{
int a,b;
};
void exgcd(long long a,long long b,long long &x,long long &y,long long &d)
{
if(!b)
{
x=1;
y=0;
d=a;
return;
}
exgcd(b,a%b,y,x,d);
y=y-a/b*x;
}
long long china()
{
long long d,x=0,y;
for(int i=1;i<=tot;i++)
{
long long r=P/mod[i];
exgcd(mod[i],r,d,y,d);
x=(x+r*y*a[i])%P;
}
return (x+P)%P;
}
long long ksm(long long a,long long b,long long mod)
{
long long r=1ll;
while(b)
{
if(b&1)
r=r*a%mod;
a=a*a%mod;
b>>=1;
}
return r;
}
long long inv(long long a,long long b)
{
long long x,y,d;
exgcd(a,b,x,y,d);
return (x%b+b)%b;
}
qwe fac(long long k,long long n)
{
qwe r;
if(!n)
{
r.a=0,r.b=1;
return r;
}
long long x=n/p[k],y=n/mod[k],ans=1ll;
if(y)
{
for(int i=2;i<mod[k];i++)
if(i%p[k]!=0)
ans=ans*i%mod[k];
ans=ksm(ans,y,mod[k]);
}
for(int i=y*mod[k]+1;i<=n;i++)
if(i%p[k]!=0)
ans=ans*i%mod[k];
qwe tmp=fac(k,x);
r.a=x+tmp.a,r.b=ans*tmp.b%P;
return r;
}
long long clc(int k,long long n,long long m)
{
if(n<m)
return 0;
qwe a=fac(k,n),b=fac(k,m),c=fac(k,n-m);
return ksm(p[k],a.a-b.a-c.a,mod[k])*a.b%mod[k]*inv(b.b,mod[k])%mod[k]*inv(c.b,mod[k])%mod[k];
}
long long wk(long long n,long long m)
{
for(int i=1;i<=tot;i++)
a[i]=clc(i,n,m);
return china();
}
int main()
{
scanf("%lld%lld%lld",&P,&n,&m);
for(int i=1;i<=m;i++)
scanf("%lld",&w[i]),sum+=w[i];
int x=P;
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
p[++tot]=i;
mod[tot]=1;
while(x%i==0)
{
x/=i;
cnt[tot]++;
mod[tot]*=i;
}
}
if(x>1)
{
p[++tot]=x;
mod[tot]=x;
cnt[tot]=1;
}
if(sum>n)
{
puts("Impossible");
return 0;
}
long long ans=wk(n,sum)%P;
for(int i=1;i<=m;i++)
{
ans=ans*wk(sum,w[i])%P;
sum-=w[i];
}
printf("%lld\n",ans);
return 0;
}

bzoj 2142: 礼物【中国剩余定理+组合数学】的更多相关文章

  1. BZOJ 2142 礼物 组合数学 CRT 中国剩余定理

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

  2. BZOJ 2142: 礼物 [Lucas定理]

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

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

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

  4. 【刷题】BZOJ 2142 礼物

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

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

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

  6. BZOJ 2142: 礼物

    模非素数下的排列组合,简直凶残 调着调着就过了= = 都不知道怎么过的= = 直接上链接http://hi.baidu.com/aekdycoin/blog/item/147620832b567eb4 ...

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

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

  8. BZOJ 2142 礼物 数论

    这道题是求组合数终极版. C(n,m) mod P n>=1e9 m>=1e9 P>=1e9且为合数且piqi<=1e5 拓展lucas定理. 实际上就是一点数论小知识的应用. ...

  9. BZOJ 1951 [SDOI2010]古代猪文 (组合数学+欧拉降幂+中国剩余定理)

    题目大意:求$G^{\sum_{m|n} C_{n}^{m}}\;mod\;999911659\;$的值$(n,g<=10^{9})$ 并没有想到欧拉定理.. 999911659是一个质数,所以 ...

随机推荐

  1. 谈谈APP架构选型:React Native还是HBuilder

    原文链接 导读:最近公司的一款新产品APP要进行研发,老大的意思想用H5来做混合APP以达到高效敏捷开发的目的.我自然就开始进行各种技术选型的调研,这里重点想说的是我最后挑选出的2款hybrid ap ...

  2. 前端学习之-- DOM

    Dom == document 1:查找 1:直接查找 document.getElementById('i1') # 根据ID获取一个标签(获取单个元素) document.getElementsB ...

  3. 2018 11.2 PION模拟赛

    期望:100 + 50 + 30 = 180 实际:0 + 50 + 30 =80 期望:100   实际:0 数值有负数,边界应该设为-0x7f       此处 gg /* 期望的分:50+ */ ...

  4. (转)Redis

    Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介 Redis是 一个key-value存储系统.和Memcached类似,但是解决 ...

  5. Linux终端Shell下的常用快捷键收集

    删除 [Ctrl]+[D]删除光标所在位置上的字符相当于VIM里x或者dl [Ctrl]+[H]删除光标所在位置前的字符相当于VIM里hx或者dh [Ctrl]+[K]删除光标后面所有字符相当于VIM ...

  6. Eclipse中git插件导入远程库和上传项目源代码到远程库

    陆陆续续,从github,csdn的code.之前实习的小公司也是用git管理.发如今版本号控制方面确实比較方便.代码一敲完 . 自己由于完毕了新功能.加入一个新分支.然后提交上去,这就是程序猿一天干 ...

  7. iOS开发--URL中汉字出现乱码

    NSURL *nurl=[[NSURL alloc] initWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF ...

  8. 关于对FLASH开发,starling、starling feathers、starling MVC框架的理解

    说在前头:楼主之前没有不论什么flash开发经验,仅仅是从一次尝试中总结自己的理解和经验而已.假设有写的不正确的地方,欢迎大家指正. 前一段时间尝试想用flash(as3)又一次制作一下之前做的一个游 ...

  9. The sandbox is not sync with the Podfile.lock

    github下载的Demo,很多时候使用到CocoaPods,有的时候因为依赖关系或者版本问题不能编译运行. 出现 以下错误 The sandbox is not sync with the Podf ...

  10. JS日历控件 灵活设置: 精确的时分秒.

     在今年7月份时候 写了一篇关于 "JS日历控件" 的文章 , 当时仅仅支持 年月日 的日历控件,如今优化例如以下:      1. 在原基础上 支持 yyyy-mm-dd 的年月 ...